Drop I-frames, duplicate P-frames, and watch the compression tear. A timeline editor that manipulates the AVI bitstream directly — no re-encoding, no decoding, just the glitch.
Download for Linux, Windows or macOS → · Website · Sample output (AVI)
Datamosh GUI is a PySide6 desktop editor built for experimental compression-art workflows.
- Build a sequence from multiple clips on a timeline
- Drag clips from bin to timeline, reorder segments, and cut at playhead (snaps to frames)
- Per-segment glitch settings: each timeline segment can override the clip's keep/duplicate/keyframe settings, so the same clip can appear twice moshed differently
- Toggle "Drop first I-frame" on individual cuts/segments
- Duplicate P-frames to push motion-smear and prediction artifacts
- Preview timeline output before final render
- Export to AVI (native Xvid), or MP4/MOV (H.264, re-encoded for easy sharing)
- Save/open projects as
.dmoshfiles (clips, timeline, and settings) - Undo/redo timeline and settings changes
The app keeps AVI bitstream manipulation in mosh.py and uses the GUI as an editor/orchestrator.
main.py: GUI entrypointgui/: active PySide6 applicationmosh.py: core AVI parser/rewriter + CLItests/: pytest suitelegacy/: old Tkinter-era code (reference only, not active)
- Python 3.10+
ffmpegandffprobeavailable onPATH
Install Python deps:
pip install -r requirements.txtpython3 main.pyOr use:
./launch.sh- Latest release: https://github.com/willbearfruits/datamosh-gui/releases/latest
- Download portal:
https://willbearfruits.github.io/datamosh-gui/ - Release pipeline:
.github/workflows/release.yml - Packaging details:
RELEASES.md
Local build output naming (Linux host):
local-release-artifacts/Datamosh-<version>-linux-portable.tar.gzlocal-release-artifacts/Datamosh-<version>-linux-installer.deblocal-release-artifacts/Datamosh-<version>-linux-<arch>.AppImagelocal-release-artifacts/SHA256SUMS-linux.txt
Cross-platform local attempt logs (Linux host):
local-release-artifacts/windows-build-attempt.loglocal-release-artifacts/macos-build-attempt.log
Use native OS runners for release-quality builds. Linux can package Linux artifacts locally; Windows and macOS should be built on their own platforms.
Linux:
pyinstaller --noconfirm --clean --windowed --name Datamosh \
--add-data "README.md:." \
--add-data "LICENSE:." \
--add-data "VERSION:." \
main.py
./packaging/linux/build_deb.sh "$(cat VERSION)" "dist/Datamosh" "local-release-artifacts"
./packaging/linux/build_appimage.sh "$(cat VERSION)" "dist/Datamosh" "local-release-artifacts"Windows (PowerShell, run on Windows):
pyinstaller --noconfirm --clean --windowed --name Datamosh `
--add-data "README.md;." `
--add-data "LICENSE;." `
--add-data "VERSION;." `
main.pymacOS (run on macOS):
pyinstaller --noconfirm --clean --windowed --name Datamosh \
--add-data "README.md:." \
--add-data "LICENSE:." \
--add-data "VERSION:." \
--osx-bundle-identifier com.datamosh.gui \
main.py- Open one or more source clips.
- Choose import mode/settings (normalize recommended, direct-AVI optional advanced).
- Wait for ingest/normalization to complete.
- Drag clips from bin to timeline and reorder as needed.
- Use playhead +
Cut(Ctrl+K) to split timeline segments. - Inject a one-frame I-frame clip from image/video (
Ctrl+Shift+I) when needed. - Toggle
Drop I(I) for selected segment when needed. - Adjust per-clip/segment settings:
- Keep extra keyframes after first
- Duplicate count
- Duplicate gap
- Keep/drop specific keyframe indices
- Preview timeline output.
- Render final AVI.
Ctrl+N: new projectCtrl+Shift+P: open project (.dmosh)Ctrl+S: save projectCtrl+Shift+S: save project asCtrl+O: open clipsCtrl+Shift+O: add clipsCtrl+R: renderCtrl+Z: undoCtrl+Shift+Z/Ctrl+Y: redoSpace: play/pause previewLeft/Right: frame stepCtrl+K: cut selected timeline segment at playheadCtrl+Shift+I: inject single I-frame clip from mediaI: toggle drop-first I-frame for selected segmentDelete: remove selected timeline segmentF1: shortcut help
mosh.py is usable directly for scripted workflows:
python3 mosh.py input.avi output.avi --keep-first 1 --duplicate-count 2 --duplicate-gap 3Normalization example:
python3 mosh.py input.mp4 output.avi --normalize --normalize-preset balancedHeadless-safe full suite:
QT_QPA_PLATFORM=offscreen pytest -qSave your whole session — clips, per-clip mosh settings, timeline arrangement, cuts,
and injected I-frames — to a .dmosh project file (File > Save Project, Ctrl+S).
Reopening (File > Open Project, Ctrl+Shift+P) recreates the clips from their source
paths and re-ingests them, so projects stay small and portable. Source media must still
be present at its saved path; missing sources are reported and left empty. The window
title shows the project name and a * when there are unsaved changes.
Current version v1.2.0 — save/open .dmosh projects, per-segment glitch settings,
and MP4/MOV export. Full history in CHANGELOG.md, downloads on the
releases page.
If this project helps your workflow, support ongoing development and experiments:
- Patreon: https://www.patreon.com/Seriousshit
- PayPal: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=dogme84%40gmail.com¤cy_code=USD
- Renders to AVI/Xvid natively, or MP4/MOV (H.264) when you need something shareable.
- Non-AVI sources are normalized before processing.
legacy/exists for historical reference; active code path ismain.py+gui/.

