{"id":51326137,"url":"https://github.com/hhvrc/watermarker","last_synced_at":"2026-07-02T19:01:10.114Z","repository":{"id":367951292,"uuid":"1282449038","full_name":"hhvrc/Watermarker","owner":"hhvrc","description":"Desktop app for batch-adding a watermark or logo to your images, with live preview and per-image positioning.","archived":false,"fork":false,"pushed_at":"2026-06-30T17:16:26.000Z","size":275,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-07-01T18:37:51.726Z","etag":null,"topics":["batch-processing","cross-platform","desktop-app","image-processing","image-watermark","image-watermarking","rust","svelte","tailwindcss","tauri","watermark","watermarking"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hhvrc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-27T19:34:03.000Z","updated_at":"2026-06-30T17:16:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hhvrc/Watermarker","commit_stats":null,"previous_names":["hhvrc/watermarker"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/hhvrc/Watermarker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhvrc%2FWatermarker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhvrc%2FWatermarker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhvrc%2FWatermarker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhvrc%2FWatermarker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hhvrc","download_url":"https://codeload.github.com/hhvrc/Watermarker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhvrc%2FWatermarker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35059251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["batch-processing","cross-platform","desktop-app","image-processing","image-watermark","image-watermarking","rust","svelte","tailwindcss","tauri","watermark","watermarking"],"created_at":"2026-07-01T18:30:58.895Z","updated_at":"2026-07-02T19:01:10.101Z","avatar_url":"https://github.com/hhvrc.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Watermarker\n\nA fast, batch image watermarking desktop app. Drop in your images, position a watermark once, review every result, and save the whole set in one pass.\n\nBuilt with [Tauri](https://tauri.app/) (Rust core) + [SvelteKit](https://kit.svelte.dev/) + TypeScript, by [hhvrc](https://github.com/hhvrc). **Rust is the engine and the frontend is just the interface:** all pixel work (decode, downscale, composite, encode, write) happens in Rust, so the UI never touches full-resolution bitmaps.\n\n## Features\n\n- **Batch watermarking.** Import many images and export them all in one commit.\n- **Per-image placement.** Position the watermark independently on each image, with the last edit carried forward as a sticky default.\n- **WYSIWYG previews.** One shared Rust `composite()` drives both the on-screen preview and the export, so what you see is exactly what you get. Live dragging uses Canvas2D for instant feedback, and the review grid shows the exact Rust-rendered output.\n- **Resolution-independent placement.** An anchor (9-grid) plus relative margins and size, so the same settings look right on any image dimension. Free-drag snaps to the nearest anchor.\n- **Interactive editor.** Drag to move, corner handles to resize (aspect-preserving), plus Position / Margin / Size / Opacity controls.\n- **SVG \u0026 raster watermarks.** SVG logos are rasterized crisply at the target size (resvg/usvg/tiny-skia), and transparent borders are auto-trimmed so the watermark box hugs its content.\n- **Presets.** Save and recall named bundles of watermark + full placement.\n- **Clean export.** Optionally also write a non-watermarked PNG of the source, handy for converting TIFF or other inputs.\n- **Metadata handling.** Preserves EXIF/ICC into the output, bakes EXIF orientation into the pixels, and records a standard PNG `Software` tag identifying the editor. A privacy option strips all metadata (including the Software tag) so outputs carry none.\n- **Persistent settings.** Watermark, output folder, placement, and presets are remembered across launches (Rust-backed `settings.json`, not localStorage).\n\n### Formats\n\n- **Input:** PNG, JPG, TIFF, WebP\n- **Output:** PNG\n- **Watermarks:** SVG (vector) or raster\n\n## How it works\n\n1. **Load.** Drag images onto the window (native drag-drop hands Rust file paths) or use the picker.\n2. **Position.** Set the watermark placement per image in the editor, nudging each one as needed.\n3. **Stage.** Open the review grid showing every image with its exact Rust-rendered result.\n4. **Commit.** Save the whole set to your output folder.\n\nDropping a watermark file onto the watermark zone sets it (and persists it); dropping elsewhere imports images.\n\n## Getting started\n\n### Prerequisites\n\n- [Rust](https://www.rust-lang.org/tools/install) (stable)\n- Node.js `^26` and [pnpm](https://pnpm.io/) `11.9+`\n- Platform [dependencies for Tauri](https://tauri.app/start/prerequisites/)\n\n### Install\n\n```sh\npnpm install\n```\n\n### Develop\n\n```sh\npnpm tauri dev\n```\n\n### Build\n\n```sh\npnpm tauri build\n```\n\n## Project layout\n\n```\nsrc/                      SvelteKit frontend (the interface)\n  lib/components/         Editor, queue, review grid, presets, controls\n  lib/ipc.ts              Typed wrappers over Tauri commands\n  lib/placement*.ts       Placement math + canvas mapping (unit-tested)\nsrc-tauri/src/            Rust engine\n  decode.rs               Image decoding (with decompression-bomb limits)\n  watermark.rs            Watermark loading, SVG rasterization, trim\n  placement.rs            Anchor + relative-size placement resolution\n  compositor.rs           Blending / rotation / scaling\n  preview.rs              Downscaled previews for display\n  export.rs               PNG encoding + write\n  metadata.rs             EXIF/ICC transplant + Software tag\n  settings.rs             Persistent settings \u0026 managed watermark store\n  commands.rs             Tauri command surface\n```\n\n## Development\n\n```sh\n# Frontend\npnpm check            # svelte-check (keep at 0 warnings)\npnpm test             # vitest unit tests\npnpm format           # prettier\n\n# Rust (from src-tauri/)\ncargo fmt\ncargo clippy --all-targets -- -D warnings\ncargo test --release\n```\n\nCI runs `pnpm check` + `pnpm test` (frontend) and `cargo fmt --check` / `clippy -D warnings` / `cargo test` (Rust). Tagging `v*` builds a draft GitHub release.\n\n## License\n\n[GNU General Public License v3.0 or later](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhhvrc%2Fwatermarker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhhvrc%2Fwatermarker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhhvrc%2Fwatermarker/lists"}