16 Commits

Author SHA1 Message Date
forust d0841d2c9b chore: release v1.3.1
release / verify (push) Successful in 28s
release / linux-amd64 (push) Failing after 47s
2026-07-12 14:22:45 +02:00
forust af2deabca4 feat: add mute_input, inhibit_sleep, monitor-off, notify actions
- mute_input: toggle mic via wpctl/pactl
- inhibit_sleep: systemd-inhibit during timer
- monitor-off: dpms backends (hyprland, niri, sway, kde, gnome, x11)
- notify: notify-send on timer finish
- lock: refactored with backend selection (loginctl, hyprlock,
  swaylock, i3lock, gnome, kde, xscreensaver)
- workspace: custom command override, sway/i3 backends
- power: add suspend, hibernate, hybrid-sleep modes
- editor: split VISUAL/EDITOR into program+args
- run: check stop flag during action loop
- history: record "partial" on action failures
2026-07-12 10:08:38 +02:00
forust 1edb82a057 feat: add monitor-off action, sway/i3 workspace
Monitor-off follows same per-backend dispatch as workspace.
Backends: hyprland, niri, sway, kde, gnome, x11, auto.
New workspace backends: sway, i3.
2026-07-07 23:23:50 +02:00
forust 1a77043a71 fix: editor split, stop flag in actions, write errors, history on failure, expect panic, string match
- src/main.rs: split VISUAL/EDITOR into prog+args, drop expect panic in reap_timer, propagate write_timer errors, check stop during actions, record history on partial failure, use const for stop msg
- Cargo.toml: add authors/homepage, bump noyalib 0.0.12->0.0.13
- release.yaml: tighten tag glob, fix curl 404 fallback, URI-encode asset name, upgrade upload-artifact v3->v4
- ci.yaml: add cargo cache step
- README.md: sync feature list, fix push to two-step
- RELEASING.md: clarify Cargo.lock regeneration
2026-07-07 23:13:19 +02:00
forust 69e20c89ee chore: release v1.2.2
ci / rust (push) Successful in 53s
ci / lint-yaml (push) Successful in 5s
release / verify (push) Successful in 27s
release / linux-amd64 (push) Successful in 38s
2026-07-05 03:26:48 +02:00
forust 549025dfe7 chore: release v1.2.1
release / verify (push) Successful in 25s
ci / rust (push) Successful in 48s
ci / lint-yaml (push) Successful in 4s
release / linux-amd64 (push) Successful in 30s
2026-07-05 02:53:49 +02:00
forust fface10081 feat: use large timer display
ci / rust (push) Successful in 44s
ci / lint-yaml (push) Successful in 5s
2026-07-05 02:51:26 +02:00
forust 2c32f5856b chore: release v1.2.0
release / verify (push) Successful in 26s
ci / rust (push) Successful in 45s
ci / lint-yaml (push) Successful in 5s
release / linux-amd64 (push) Successful in 29s
2026-07-05 02:37:18 +02:00
forust 1babd404f9 docs: document timer utilities
ci / rust (push) Successful in 45s
ci / lint-yaml (push) Successful in 5s
2026-07-05 02:33:21 +02:00
forust ce35617bbe feat: show fullscreen timer view 2026-07-05 02:31:58 +02:00
forust f4c54837de feat: add timer cli utilities 2026-07-05 02:30:27 +02:00
forust 483ef2fecf fix: publish valid release assets
ci / rust (push) Successful in 41s
ci / lint-yaml (push) Successful in 4s
2026-07-05 02:20:20 +02:00
forust ce236bc49f feat: hide disabled action settings 2026-07-05 02:20:04 +02:00
forust b067cf572e fix: harden timer lifecycle 2026-07-05 02:19:46 +02:00
forust af95742f69 build: publish raw release binary 2026-07-05 01:49:17 +02:00
forust 0b0f0af82d docs: remove version-specific README text
ci / rust (push) Successful in 43s
ci / lint-yaml (push) Successful in 5s
2026-07-03 23:54:23 +02:00
10 changed files with 2510 additions and 297 deletions
+8
View File
@@ -14,6 +14,14 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Cache Cargo registry and build
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
target
key: cargo-${{ hashFiles('Cargo.lock') }}
- name: Check formatting - name: Check formatting
shell: bash shell: bash
run: cargo fmt --check run: cargo fmt --check
+10 -8
View File
@@ -3,7 +3,7 @@ name: release
"on": "on":
push: push:
tags: tags:
- "v*.*.*" - "v[0-9]*.[0-9]*.[0-9]*"
workflow_dispatch: workflow_dispatch:
permissions: permissions:
@@ -56,9 +56,10 @@ jobs:
tag="${GITHUB_REF##*/}" tag="${GITHUB_REF##*/}"
version="${tag#v}" version="${tag#v}"
mkdir -p dist mkdir -p dist
cp target/release/gosleep-timer dist/gosleep-timer binary="gosleep-timer-${version}-linux-amd64"
tar -C dist -czf "dist/gosleep-timer-${version}-linux-amd64.tar.gz" gosleep-timer cp target/release/gosleep-timer "dist/${binary}"
sha256sum "dist/gosleep-timer-${version}-linux-amd64.tar.gz" > "dist/gosleep-timer-${version}-linux-amd64.tar.gz.sha256" cd dist
sha256sum "${binary}" > "${binary}.sha256"
- name: Create Gitea release - name: Create Gitea release
id: release id: release
@@ -68,7 +69,7 @@ jobs:
release_url="https://gitea.forust.xyz/api/v1/repos/forust/gosleep/releases" release_url="https://gitea.forust.xyz/api/v1/repos/forust/gosleep/releases"
existing="$(curl -fsS \ existing="$(curl -fsS \
"${release_url}/tags/${tag}" \ "${release_url}/tags/${tag}" \
-H "Authorization: token ${GITEA_TOKEN}" || true)" -H "Authorization: token ${GITEA_TOKEN}")" || existing='{}'
release_id="$(printf '%s' "$existing" | jq -r '.id // empty')" release_id="$(printf '%s' "$existing" | jq -r '.id // empty')"
if [ -z "$release_id" ]; then if [ -z "$release_id" ]; then
@@ -100,7 +101,7 @@ jobs:
run: | run: |
release_url="https://gitea.forust.xyz/api/v1/repos/forust/gosleep/releases" release_url="https://gitea.forust.xyz/api/v1/repos/forust/gosleep/releases"
release_id="${{ steps.release.outputs.release_id }}" release_id="${{ steps.release.outputs.release_id }}"
for asset in dist/*.tar.gz dist/*.sha256; do for asset in dist/gosleep-timer-*; do
name="$(basename "$asset")" name="$(basename "$asset")"
release="$(curl -fsS \ release="$(curl -fsS \
"${release_url}/${release_id}" \ "${release_url}/${release_id}" \
@@ -111,14 +112,15 @@ jobs:
-X DELETE "${release_url}/${release_id}/assets/${asset_id}" \ -X DELETE "${release_url}/${release_id}/assets/${asset_id}" \
-H "Authorization: token ${GITEA_TOKEN}" -H "Authorization: token ${GITEA_TOKEN}"
fi fi
encoded="$(printf '%s' "$name" | jq -sRr @uri)"
curl -fsS \ curl -fsS \
-X POST "${release_url}/${release_id}/assets?name=${name}" \ -X POST "${release_url}/${release_id}/assets?name=${encoded}" \
-H "Authorization: token ${GITEA_TOKEN}" \ -H "Authorization: token ${GITEA_TOKEN}" \
-F "attachment=@${asset}" -F "attachment=@${asset}"
done done
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: gosleep-timer-linux-amd64 name: gosleep-timer-linux-amd64
path: dist/* path: dist/*
+8 -5
View File
@@ -46,10 +46,12 @@ Use a temporary config path so local tests do not mutate the user's real config:
```bash ```bash
tmpdir="$(mktemp -d)" tmpdir="$(mktemp -d)"
cargo run -- --config "$tmpdir/config.yaml" init cargo run -- --config "$tmpdir/config.yaml" init
cargo run -- --config "$tmpdir/config.yaml" validate
cargo run -- --config "$tmpdir/config.yaml" status
cargo run -- --config "$tmpdir/config.yaml" preview cargo run -- --config "$tmpdir/config.yaml" preview
``` ```
For `run` smoke tests, disable actions first so the command does not call `playerctl`, `systemctl`, `pkill`, workspace tools, or custom shell commands. For `run` smoke tests, pass `--no-actions` or disable actions first so the command does not call `playerctl`, `systemctl`, `pkill`, workspace tools, or custom shell commands.
## Versioning ## Versioning
@@ -73,20 +75,21 @@ test "$(cat VERSION)" = "$(cargo metadata --no-deps --format-version 1 | jq -r '
Release workflow is tag-based: Release workflow is tag-based:
```bash ```bash
git tag -a v1.1.1 -m "gosleep-timer v1.1.1" git tag -a vMAJOR.MINOR.PATCH -m "gosleep-timer vMAJOR.MINOR.PATCH"
git push origin main git push origin main
git push origin v1.1.1 git push origin vMAJOR.MINOR.PATCH
``` ```
The Gitea release workflow: The Gitea release workflow:
- runs formatting, tests, clippy, and YAML lint before building
- builds `target/release/gosleep-timer` - builds `target/release/gosleep-timer`
- creates `gosleep-timer-<version>-linux-amd64.tar.gz` - copies `gosleep-timer-<version>-linux-amd64`
- writes a `.sha256` - writes a `.sha256`
- creates or reuses the matching Gitea release - creates or reuses the matching Gitea release
- replaces release assets with matching names - replaces release assets with matching names
The workflow uses the built-in `GITEA_TOKEN` and declares `permissions: contents: write`. The workflow exposes `${{ secrets.GITEA_TOKEN }}` as `GITEA_TOKEN` and declares `permissions: contents: write`.
## Git Remote ## Git Remote
+54
View File
@@ -4,6 +4,56 @@ All notable changes to this project are documented here.
The project uses semantic versioning. Tags are formatted as `vMAJOR.MINOR.PATCH`. The project uses semantic versioning. Tags are formatted as `vMAJOR.MINOR.PATCH`.
## [1.3.1] - 2026-07-12
### Added
- Added `mute_input` action to toggle microphone mute via `wpctl`/`pactl`.
- Added `inhibit_sleep` config option to run `systemd-inhibit` during the timer.
- Added `monitor` action with backend selection (hyprland, niri, sway, kde, gnome, x11) to turn off displays.
- Added `notify` action to send desktop notification on timer finish.
- Added `suspend`, `hibernate`, `hybrid-sleep` power modes.
- Added workspace backend support for `sway` and `i3`.
- Added custom `workspace command` override.
### Changed
- Lock action refactored with backend selection: `loginctl`, `hyprlock`, `swaylock`, `i3lock`, `gnome`, `kde`, `xscreensaver`.
- Editor command now correctly splits `VISUAL`/`EDITOR` into program and arguments.
- Timer action loop checks the stop flag between actions.
### Fixed
- History now records `partial` status when some actions fail instead of bailing entirely.
## [1.2.2] - 2026-07-05
### Changed
- Updated Ratatui to 0.30.2 to remove the unmaintained `paste` transitive dependency and pick up the fixed `lru` dependency line.
- Replaced deprecated `serde_yaml`/`unsafe-libyaml` with the pure-Rust `noyalib` YAML parser.
## [1.2.1] - 2026-07-05
### Changed
- Updated the TUI running screen to center a larger termdown-style ASCII time-left display above progress and post-countdown commands.
## [1.2.0] - 2026-07-05
### Added
- Added `status`, `validate`, `edit`, `history`, and `stats` CLI commands.
- Added `run --dry-run` and `run --no-actions` for safer timer verification.
- Added TUI pause/resume support and a fullscreen running timer view with large ASCII time-left display.
- Added history recording for completed sessions and aggregate sleep/timer statistics.
- Added red highlighting for dangerous post-timer actions and common destructive custom commands.
### Changed
- TUI settings now hide dependent options when their parent action is disabled.
- Release assets are published as a raw Linux binary plus `.sha256` instead of a tar archive.
## [1.1.3] - 2026-07-03 ## [1.1.3] - 2026-07-03
### Fixed ### Fixed
@@ -27,6 +77,10 @@ The project uses semantic versioning. Tags are formatted as `vMAJOR.MINOR.PATCH`
- Added YAML configuration, CLI `init`, `preview`, and `run` commands. - Added YAML configuration, CLI `init`, `preview`, and `run` commands.
- Added Gitea CI and tag-based release workflows. - Added Gitea CI and tag-based release workflows.
[1.3.1]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.3.1
[1.2.2]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.2.2
[1.2.1]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.2.1
[1.2.0]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.2.0
[1.1.3]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.3 [1.1.3]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.3
[1.1.2]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.2 [1.1.2]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.2
[1.1.1]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.1 [1.1.1]: https://gitea.forust.xyz/forust/gosleep/releases/tag/v1.1.1
Generated
+1107 -174
View File
File diff suppressed because it is too large Load Diff
+6 -4
View File
@@ -1,11 +1,13 @@
[package] [package]
name = "gosleep-timer" name = "gosleep-timer"
version = "1.1.3" version = "1.3.1"
authors = ["forust"]
edition = "2024" edition = "2024"
rust-version = "1.85" rust-version = "1.88"
description = "Terminal sleep timer for Linux desktop actions, with YAML config and a Rust TUI" description = "Terminal sleep timer for Linux desktop actions, with YAML config and a Rust TUI"
license = "MIT" license = "MIT"
repository = "https://gitea.forust.xyz/forust/gosleep" repository = "https://gitea.forust.xyz/forust/gosleep"
homepage = "https://gitea.forust.xyz/forust/gosleep"
readme = "README.md" readme = "README.md"
keywords = ["timer", "tui", "linux", "desktop", "sleep"] keywords = ["timer", "tui", "linux", "desktop", "sleep"]
categories = ["command-line-utilities"] categories = ["command-line-utilities"]
@@ -18,9 +20,9 @@ path = "src/main.rs"
anyhow = "1.0" anyhow = "1.0"
clap = { version = "4.5", features = ["derive"] } clap = { version = "4.5", features = ["derive"] }
crossterm = "0.29" crossterm = "0.29"
ratatui = "0.29" ratatui = "0.30.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9" noyalib = "0.0.13"
[profile.release] [profile.release]
codegen-units = 1 codegen-units = 1
+50 -10
View File
@@ -6,8 +6,7 @@ Rust TUI sleep timer for Linux desktop actions.
## Status ## Status
- Current version: `1.1.1` - Release tags: `vMAJOR.MINOR.PATCH`
- Release tags: `vMAJOR.MINOR.PATCH`, for example `v1.1.1`
- Primary repository: <https://gitea.forust.xyz/forust/gosleep> - Primary repository: <https://gitea.forust.xyz/forust/gosleep>
- SSH upstream: `ssh://git@gitssh.forust.xyz:2221/forust/gosleep.git` - SSH upstream: `ssh://git@gitssh.forust.xyz:2221/forust/gosleep.git`
@@ -16,7 +15,7 @@ Rust TUI sleep timer for Linux desktop actions.
- Single Rust binary, independent of Python. - Single Rust binary, independent of Python.
- Ratatui/Crossterm terminal UI. - Ratatui/Crossterm terminal UI.
- YAML config at `~/.config/gosleep-timer/config.yaml` or `$XDG_CONFIG_HOME/gosleep-timer/config.yaml`. - YAML config at `~/.config/gosleep-timer/config.yaml` or `$XDG_CONFIG_HOME/gosleep-timer/config.yaml`.
- CLI commands for initialization, preview, and direct timer runs. - CLI commands for init, status, validate, edit, preview, run, history, and stats.
- Time-left display and progress bar. - Time-left display and progress bar.
- Wrapped command preview for smaller terminals. - Wrapped command preview for smaller terminals.
- Linux desktop action support for niri, Hyprland, KDE, playerctl, brightnessctl/light, PipeWire/PulseAudio, systemd, and custom shell commands. - Linux desktop action support for niri, Hyprland, KDE, playerctl, brightnessctl/light, PipeWire/PulseAudio, systemd, and custom shell commands.
@@ -34,11 +33,11 @@ install -Dm755 target/release/gosleep-timer ~/.local/bin/gosleep-timer
### From release artifact ### From release artifact
Download `gosleep-timer-<version>-linux-amd64.tar.gz` from the Gitea release page, then: Download `gosleep-timer-<version>-linux-amd64` and its `.sha256` from the Gitea release page, then:
```bash ```bash
tar -xzf gosleep-timer-1.1.1-linux-amd64.tar.gz sha256sum -c gosleep-timer-<version>-linux-amd64.sha256
install -Dm755 gosleep-timer ~/.local/bin/gosleep-timer install -Dm755 gosleep-timer-<version>-linux-amd64 ~/.local/bin/gosleep-timer
``` ```
## Usage ## Usage
@@ -61,6 +60,24 @@ Preview commands that will run after the countdown:
gosleep-timer preview gosleep-timer preview
``` ```
Show the current config, enabled actions, and dangerous-action markers:
```bash
gosleep-timer status
```
Validate the config without starting the timer:
```bash
gosleep-timer validate
```
Open the config in `$VISUAL`, `$EDITOR`, or `vi`:
```bash
gosleep-timer edit
```
Run the saved timer config: Run the saved timer config:
```bash ```bash
@@ -74,6 +91,20 @@ gosleep-timer run 45m
gosleep-timer run 1h30m gosleep-timer run 1h30m
``` ```
Run the countdown without executing post-timer actions:
```bash
gosleep-timer run --dry-run 10s
gosleep-timer run --no-actions 10s
```
Inspect recorded sessions and aggregate stats:
```bash
gosleep-timer history
gosleep-timer stats
```
Use a custom config path: Use a custom config path:
```bash ```bash
@@ -90,6 +121,7 @@ gosleep-timer --config ./config.yaml preview
| `Enter` while editing | Apply edit | | `Enter` while editing | Apply edit |
| `Esc` while editing | Cancel edit | | `Esc` while editing | Cancel edit |
| `r` | Start/restart timer | | `r` | Start/restart timer |
| `p` | Pause/resume running timer |
| `x` | Stop timer | | `x` | Stop timer |
| `s` | Save config | | `s` | Save config |
| `q` / `Esc` | Quit | | `q` / `Esc` | Quit |
@@ -113,6 +145,8 @@ actions:
value: 30 value: 30
mute: mute:
enabled: false enabled: false
mute_input:
enabled: false
lock: lock:
enabled: false enabled: false
command: loginctl lock-session command: loginctl lock-session
@@ -155,6 +189,12 @@ Other actions use common Linux desktop tools:
- `systemctl` - `systemctl`
Install only the tools needed for the actions you enable. Install only the tools needed for the actions you enable.
Dangerous actions such as `pkill`, power actions, and common destructive custom commands are highlighted in red in the TUI preview.
## History
Completed timer sessions are appended to `history.yaml` next to the active config file.
If no poweroff or reboot action is configured, CLI `run` asks for wake confirmation after the timer finishes and records the elapsed sleep time.
## Development ## Development
@@ -185,8 +225,9 @@ Version is stored in:
Release tags must match the package version: Release tags must match the package version:
```bash ```bash
git tag -a v1.1.1 -m "gosleep-timer v1.1.1" git tag -a vMAJOR.MINOR.PATCH -m "gosleep-timer vMAJOR.MINOR.PATCH"
git push origin main --tags git push origin main
git push origin vMAJOR.MINOR.PATCH
``` ```
## Releases ## Releases
@@ -198,12 +239,11 @@ Required runner tools:
- Rust stable toolchain with `cargo`, `rustfmt`, and `clippy` - Rust stable toolchain with `cargo`, `rustfmt`, and `clippy`
- `curl` - `curl`
- `jq` - `jq`
- `tar`
- `sha256sum` - `sha256sum`
Release authentication: Release authentication:
- The workflow uses Gitea Actions' built-in `GITEA_TOKEN`. - The workflow exposes Gitea Actions' built-in `${{ secrets.GITEA_TOKEN }}` as `GITEA_TOKEN`.
- The workflow declares `permissions: contents: write` so the token can create releases and upload assets. - The workflow declares `permissions: contents: write` so the token can create releases and upload assets.
See [RELEASING.md](RELEASING.md) for the full release checklist. See [RELEASING.md](RELEASING.md) for the full release checklist.
+12 -12
View File
@@ -36,7 +36,6 @@ https://gitea.forust.xyz/forust/gosleep.git
- `clippy` - `clippy`
- `curl` - `curl`
- `jq` - `jq`
- `tar`
- `sha256sum` - `sha256sum`
- Docker, if using the YAML lint job as written - Docker, if using the YAML lint job as written
4. Confirm Actions job token permissions allow `contents: write`. 4. Confirm Actions job token permissions allow `contents: write`.
@@ -44,16 +43,16 @@ https://gitea.forust.xyz/forust/gosleep.git
## Version Bump Checklist ## Version Bump Checklist
For a patch bump, for example `1.1.1` to `1.1.2`: For a patch bump, for example `1.1.3` to `1.1.4`:
```bash ```bash
version=1.1.2 version=1.1.4
``` ```
Update: Update:
- `Cargo.toml`: `package.version` - `Cargo.toml`: `package.version`
- `Cargo.lock`: package version, regenerated by Cargo - `Cargo.lock`: run `cargo build --release` (without `--locked`) to regenerate
- `VERSION` - `VERSION`
- `CHANGELOG.md` - `CHANGELOG.md`
@@ -70,20 +69,20 @@ cargo build --release --locked
```bash ```bash
git status --short git status --short
git commit -am "chore: release v1.1.2" git commit -am "chore: release v${version}"
git tag -a v1.1.2 -m "gosleep-timer v1.1.2" git tag -a "v${version}" -m "gosleep-timer v${version}"
git push origin main git push origin main
git push origin v1.1.2 git push origin "v${version}"
``` ```
The `.gitea/workflows/release.yaml` workflow will: The `.gitea/workflows/release.yaml` workflow will:
1. Re-run release gates: `cargo fmt --check`, `cargo test --locked`, `cargo clippy --locked -- -D warnings`, and YAML lint. 1. Re-run release gates: `cargo fmt --check`, `cargo test --locked`, `cargo clippy --locked -- -D warnings`, and YAML lint.
2. Build `target/release/gosleep-timer`. 2. Build `target/release/gosleep-timer`.
3. Package `gosleep-timer-<version>-linux-amd64.tar.gz`. 3. Copy binary as `gosleep-timer-<version>-linux-amd64`.
4. Generate a SHA-256 checksum. 4. Generate a SHA-256 checksum.
5. Create a Gitea release. 5. Create a Gitea release.
6. Upload the archive and checksum as release assets. 6. Upload the binary and checksum as release assets.
The workflow is idempotent: if the release already exists, it reuses it and replaces assets with matching names. The workflow is idempotent: if the release already exists, it reuses it and replaces assets with matching names.
If any lint or test step fails, the build and release job will not run. If any lint or test step fails, the build and release job will not run.
@@ -96,7 +95,8 @@ If Actions are unavailable:
version="$(cat VERSION)" version="$(cat VERSION)"
cargo build --release --locked cargo build --release --locked
mkdir -p dist mkdir -p dist
cp target/release/gosleep-timer dist/gosleep-timer binary="gosleep-timer-${version}-linux-amd64"
tar -C dist -czf "dist/gosleep-timer-${version}-linux-amd64.tar.gz" gosleep-timer cp target/release/gosleep-timer "dist/${binary}"
sha256sum "dist/gosleep-timer-${version}-linux-amd64.tar.gz" > "dist/gosleep-timer-${version}-linux-amd64.tar.gz.sha256" cd dist
sha256sum "${binary}" > "${binary}.sha256"
``` ```
+1 -1
View File
@@ -1 +1 @@
1.1.3 1.3.1
+1244 -73
View File
File diff suppressed because it is too large Load Diff