diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a210cf0..4d17601 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,9 @@ on: - 'docs/**' - 'LICENSE' - '.github/ISSUE_TEMPLATE/**' + # Tests cannot change the installer either. + - 'test/**' + - 'e2e/**' pull_request: paths: - '.github/workflows/release.yml' diff --git a/CLAUDE.md b/CLAUDE.md index a0eb883..ad8200e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,26 +1,30 @@ # Filesmith -A desktop **file toolkit**: drop files and run operations — convert, compress, resize, -upscale, remove background, PDF tools (extract text, PDF→images, compress) and archive -tools (repack CBZ/CBR/CB7/CBT, extract, archive↔PDF) — across images, video, audio, -PDFs, documents and archives, with batch queues, thumbnails, and live progress. +A desktop **file toolkit**: drop files and run operations (convert, compress, resize, upscale, +remove background, generate, PDF tools, archive repack/extract, archive to/from PDF) across +images, video, audio, PDFs, documents and archives, with batch queues, thumbnails and live +progress. The same engine runs as the `filesmith` CLI and in the in-app console. + +Docs: user docs in `docs/` (getting-started, operations, models, cli), developer overview in +`docs/architecture.md`, kept mockups in `docs/mockups/README.md`. Old upgrade plans and the +dependency audit: `C:\Users\Admin\Documents\Claude\research\filesmith\`. ## What it is Electron + TypeScript desktop app. Renderer is React + TypeScript + Vite + Tailwind v4. The heavy lifting is done by external CLI tools (ffmpeg, ImageMagick, mutool, CaesiumCLT, -7-Zip, Real-ESRGAN, rembg); the app orchestrates them. Writing RAR/CBR is the one -operation that needs a tool we cannot bundle (WinRAR's Rar.exe), so it is detected at -runtime and the target is greyed out when absent. Windows-first, unsigned installer via -GitHub Releases (mirrors the sibling RCMM project's distribution). +7-Zip, Real-ESRGAN, LibreOffice, Ghostscript, rembg); the app orchestrates them. Writing +RAR/CBR is the one operation that needs a tool we cannot bundle (WinRAR's Rar.exe), so it is +detected at runtime and the target is greyed out when absent. Windows-first, unsigned +installer via GitHub Releases (mirrors the sibling RCMM project's distribution). Origin: the operations are ported from RCMM's audited `rcmm-convert/compress/upscale/removebg` PowerShell scripts (`../RCMM/manager/src/RCMM/`), lifted into a real GUI app. -## Design process — READ THIS +## Design process (READ THIS) Navigation is VERB-first: the rail is Convert / Compress / Resize / Upscale / -Remove BG / Generate / Tools, each owning one queue that may hold several +Remove BG / Generate / PDF Tools, each owning one queue that may hold several convert groups at once. A selection never spans two convert groups, because one options panel can only describe one target set. See `src/shared/tabs.ts`. @@ -29,6 +33,8 @@ strict monochrome. Rules and feedback trail: `docs/design/redesign-direction.md` **View sizes (2026-10-05):** `docs/mockups/view-zoom/04-explorer-style.html`; spec `docs/superpowers/specs/2026-10-05-view-sizes-design.md`. +**Console (2026-10-06):** `docs/mockups/console/01-bottom-panel.html`; spec `docs/superpowers/specs/2026-10-06-console-design.md`. + **The look is designed collaboratively with the owner. Make NO visual assumptions.** Before building or restyling any UI, present mockups (self-contained browser HTML, like the RCMM Show/Hide exploration), offer options, and iterate to explicit sign-off. This covers @@ -39,73 +45,69 @@ experience. The renderer implements the signed-off terminal design (rules in literal. New screens still go through mockups first. Engineering/plumbing (main process, tool modules, IPC, tests, packaging) moves fast without design ceremony. -## Scope (v1, built in phases) - -1. **Images core** — convert, compress, resize. -2. **AI images** — upscale (Real-ESRGAN), remove background (rembg). Heavy tools are - downloaded on first use into `%APPDATA%/Filesmith/tools`. -3. **Media + PDF** — video/audio convert & compress (ffmpeg), PDF extract-text / images / - compress (mutool). +## Tools and dependencies -Dependencies: bundle the core tools (ffmpeg, ImageMagick, mutool, CaesiumCLT, 7-Zip) in -`resources/bin` so images/PDF work offline out of the box; fetch the AI tools on demand. - -Each phase is its own checkpoint — confirm scope before starting the next. +Bundled (offline): ffmpeg, ImageMagick, mutool, CaesiumCLT, 7-Zip in `resources/bin`, plus +`resources/libreoffice`, `resources/ghostscript` and `resources/realesrgan` (all gitignored, +staged by `scripts/fetch-binaries.mjs`). Installed on demand with uv into `%APPDATA%\Filesmith`: +rembg, PiD, spandrel. Never bundled: WinRAR. ## Project layout +Short map; details in `docs/architecture.md`. + ``` src/ - main/ Node/Electron main process — the engine - index.ts app + window bootstrap - tools/{convert,compress,resize,upscale,removebg,pdf,archive}.ts — one per operation - (planned) toolResolver.ts find bundled/PATH binaries; on-demand AI-tool download - (planned) jobQueue.ts batch queue: spawn, stream progress, cancel - (planned) output.ts collision-safe output naming (ported from RCMM Get-UniqueOutPath) - (planned) ipc.ts renderer <-> engine wiring - console/ in-app console: catalog, CLI runner (fork, staged cancel), cd - preload/ contextBridge — the typed `window.filesmith` API - renderer/ React UI: shell/ (title bar, sidebar, status bar), queue/ (files table), - inspector/ (Options, Preview, Info), options/ (one settings file per verb), - views/ (Generate, Tools, Completed, Settings), ui/ (primitives), icons/, theme/ (tokens, CSS) - console/ (bottom panel: output model, history, completion list) - shared/ types.ts — Job, ToolId, FileKind, Options, progress events - tabs.ts — the VERB-first navigation model (rail tabs + Tools cards) - cli/ the filesmith command line: parse, plan, run, report -resources/bin/ bundled CLI binaries (gitignored; fetched by scripts, packed by electron-builder) -resources/cli/ PATH shims + path.ps1 -resources/skill/ Claude Code skill + main/ Electron main process and the engine + index.ts, ipc.ts, jobQueue.ts, output.ts, toolResolver.ts, session.ts, env.ts, boot.ts + tools/ one module per operation (convert, compress, resize, upscale, removebg, pdf, + archive) + registry, plan, estimate, readiness + console/ in-app console: catalog, validation, forked CLI runs (staged cancel), cd + generate/ comfy/ pid/ rembg/ registry/ net/ + Generate, ComfyUI + spandrel, PiD, rembg, model registry, downloads + preload/ contextBridge: the typed `window.filesmith` API + renderer/src/ + components/ shell/ queue/ inspector/ options/ views/ console/ ui/ icons/ + theme/ tokens and CSS + shared/ types, tabs.ts (VERB-first navigation), per-verb option models, console line + cli/ the filesmith command line: parse, plan, run, report; commands/ +resources/ cli/ (PATH shims + path.ps1), skill/ (Claude Code skill), registry/, + pid/ and spandrel/ (Python sidecars) +e2e/ Playwright specs test/ Vitest scripts/ fetch, verify, pin tools ``` ## Build, test, run -- `npm run dev` — launch the app (electron-vite dev, HMR). -- `npm run build` — build main/preload/renderer to `out/`. -- `npm run typecheck` — node + web tsc project checks. -- `npm test` — Vitest unit tests (arg-builders, format catalogs, output collision-safety). -- `npm run lint` / `npm run format` — eslint (flat config) / prettier. -- `npm run package` — electron-vite build + electron-builder NSIS installer to `dist/`. -- `npm run test:e2e` — Playwright end-to-end (launches the built app via `_electron`; run +- `npm run dev` - launch the app (electron-vite dev, HMR). +- `npm run build` - build main/preload/renderer to `out/`. +- `npm run typecheck` - node + web tsc project checks. +- `npm test` - Vitest unit tests (arg-builders, format catalogs, output collision-safety). +- `npm run lint` / `npm run format` - eslint (flat config) / prettier. +- `npm run package` - electron-vite build + electron-builder NSIS installer to `dist/`. +- `npm run test:e2e` - Playwright end-to-end (launches the built app via `_electron`; run `npm run build` first). Covers the preload/IPC/engine chain unit tests can't reach. + `FILESMITH_SHOTS=1` also refreshes the tracked `impl-*` shots in `docs/mockups`. - `npm run cli -- ` runs the command line from `out/main/cli.js` (build first). Reference: `docs/cli.md`. The engine never imports `electron`; it reads paths from `src/main/env.ts`. - Releases: push to main runs `.github/workflows/release.yml` (gates, then requires a NEW `package.json` version, builds with `fetch-binaries --pinned`, publishes `v`). Bump the version in the PR. Tool versions + SHA-256 live in `scripts/pinned-tools.mjs`; PRs touching - the release machinery get a dry-run installer artifact. + the release machinery get a dry-run installer artifact. Pushes that only touch `**.md`, + `docs/**` or `LICENSE` do not release. ## Conventions -- TypeScript strict. Main-process code is Node; renderer is browser — keep the boundary clean +- TypeScript strict. Main-process code is Node; renderer is browser. Keep the boundary clean (all privileged work in main, exposed via the typed preload bridge; renderer never touches `fs`/`child_process`). - Tool modules own their own format catalog + argument builder and are independently testable. -- Never overwrite a user's source or an existing output file — always resolve a collision-free - name (`name (converted).ext`, ` (2)`, unique dirs). This is a hard rule ported from RCMM. +- Never overwrite a user's source or an existing output file. Always resolve a collision-free + name (`name.ext`, then `name (converted).ext`, `name (converted 2).ext`; folders get ` (2)`). + This is a hard rule ported from RCMM. - No secrets in the repo; unsigned build is expected. ## Working with the owner -Feature/fix work is tracked as GitHub issues → branch → PR (per global rules). README-only -changes commit directly. Anything touching the **look** goes through the mockup-driven design -process above — always. +Feature/fix work is tracked as GitHub issues → branch → PR (per global rules). Every change, +README and docs included, goes through a PR. Anything touching the **look** goes through the +mockup-driven design process above, always. diff --git a/README.md b/README.md index cfad361..9750d24 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,25 @@ [![Latest release](https://img.shields.io/github/v/release/Maxaubert/Filesmith?style=flat-square&color=5b5bd6&cacheSeconds=1800)](https://github.com/Maxaubert/Filesmith/releases/latest) [![Downloads](https://img.shields.io/github/downloads/Maxaubert/Filesmith/total?style=flat-square&color=5b5bd6&cacheSeconds=1800)](https://github.com/Maxaubert/Filesmith/releases) [![Windows](https://img.shields.io/badge/Windows-10%20%7C%2011-0078D4?style=flat-square)](https://github.com/Maxaubert/Filesmith/releases/latest) -[![Built with](https://img.shields.io/badge/Electron%20·%20React%20·%20TypeScript-2b2e3a?style=flat-square)](https://github.com/Maxaubert/Filesmith) +[![Built with](https://img.shields.io/badge/Electron%20·%20React%20·%20TypeScript-2b2e3a?style=flat-square)](docs/architecture.md) [![License: MIT](https://img.shields.io/badge/License-MIT-22b364?style=flat-square)](LICENSE) + +Filesmith is a Windows desktop toolkit for everyday file jobs: convert, compress, resize, upscale, +remove backgrounds, generate images, and work with PDFs and archives. Drop in a batch of files, pick +the options and run it. Outputs go next to the sources by default and never overwrite anything. The same +engine is available as the `filesmith` command line, from a built-in console or any terminal. + +![Filesmith converting a batch of images, with one job running](docs/screenshots/convert.png) + +## Docs + +- [Getting started](docs/getting-started.md): install, the main screen, your first job +- [Operations](docs/operations.md): what each operation does and its options +- [Models](docs/models.md): Upscale and Generate models, ComfyUI +- [Command line](docs/cli.md): the `filesmith` CLI and the in-app console +- [Architecture](docs/architecture.md): for developers, how the app is built, tested and shipped + +## License + +[MIT](LICENSE) diff --git a/docs/adding-models.md b/docs/adding-models.md deleted file mode 100644 index 7f951cc..0000000 --- a/docs/adding-models.md +++ /dev/null @@ -1,212 +0,0 @@ -# Adding a model to Filesmith - -Filesmith does not bake models in. What a model _is_ — how to recognize it, what files it needs, -which ComfyUI graph runs it — is **data on disk**, so you can add a model family that did not exist -when your copy of Filesmith was built, without waiting for a release. - -## Where the registry lives - -Three layers, merged by `id`, later layers winning **field by field**: - -| Layer | Path | Who writes it | -| ------------ | --------------------------------------- | ----------------------------------- | -| 1. Built-in | `/resources/registry/*.json` | ships in the installer, read-only | -| 2. Channel | `%APPDATA%/Filesmith/registry/channel/` | refreshed over the network (signed) | -| 3. **Yours** | `%APPDATA%/Filesmith/registry/user/` | you | - -Two rules that will not change: - -- **An app update replaces layer 1 only.** It never reads, writes or deletes layer 3. Your entries - survive every update, forever. -- **Layer 1 ships in the installer**, so a completely offline install still has a full catalog. - Offline is a first-class state, not a degraded one. - -Filesmith creates the layer 2 and 3 folders on first launch, so they are already there. - -## The 30-second case: a download URL went dead - -Hugging Face repos get reorganized, and when one does, a `resolve/main` URL 404s and the model -becomes un-runnable. You do not need to redefine the model — override just that one field. Create -`%APPDATA%/Filesmith/registry/user/fix-flux2.json`: - -```json -{ - "schemaVersion": 1, - "entries": [ - { - "id": "flux2", - "kind": "generate", - "label": "Flux 2 [klein]", - "provenance": { "source": "user" }, - "companionSets": [ - { - "id": "4b", - "companions": [ - { - "role": "clip", - "label": "Qwen3-4B text encoder", - "subdir": "text_encoders", - "identify": { "nameHint": "qwen_3_4b" }, - "download": { - "filename": "qwen_3_4b.safetensors", - "approxSize": "8 GB", - "urls": ["https://huggingface.co//qwen_3_4b.safetensors"] - } - } - ] - } - ] - } - ] -} -``` - -Everything else about `flux2` — its workflow graph, its sampler settings, its node requirements — -is inherited from the built-in entry. Restart Filesmith. - -## The full case: a brand-new architecture - -Copy `resources/registry/gen-archs.json` as a starting point. A generate entry has five parts: - -### `detect` — how to recognize it FROM THE FILE - -Never from the filename alone; a filename is something the user can change. - -```json -"detect": { - "tensorKeys": { "all": ["cap_embedder", "noise_refiner"], "none": ["double_blocks"] }, - "metaArch": ["z-image", "zimage"], - "sizeBytesRange": [4000000000, 14000000000], - "nameHint": "z.?image" -} -``` - -Tensor keys are matched as substrings against the safetensors header (which Filesmith reads without -touching the multi-GB weights). `all` must all be present, `any` needs at least one, `none` rejects. -`nameHint` is advisory and scores far below content evidence — it can never outvote the tensors. - -`detect` is only consulted for files Filesmith's built-in classifier could not place, so adding one -cannot disturb a family that already works. - -### `capabilities` — what it can do - -```json -"capabilities": { "task": "text-to-image", "minDim": 256, "maxDim": 2048, "dimStep": 8 } -``` - -### `sampler` — the defaults the UI fills in - -`cfg` is not cosmetic: a distilled/turbo model needs `cfg: 1`, and running it at 7 produces garbage. - -```json -"sampler": { - "name": "res_multistep", "scheduler": "simple", - "steps": 8, "cfg": 1, "guidance": 0, "hasGuidance": false -} -``` - -### `requires` — what this ComfyUI must have - -Checked against the live server's `/object_info` before anything is queued, so a missing node -produces a clear message instead of an HTTP 400. - -```json -"requires": { - "nodes": ["CLIPTextEncode", "KSampler", "VAEDecode", "SaveImage"], - "clipLoader": { "node": "CLIPLoader", "type": "lumina2" }, - "minComfyNote": "This needs ComfyUI v0.6.0 or newer." -} -``` - -### `workflow` — the graph - -A ComfyUI **API-format** graph. The easiest way to get one: build the model in ComfyUI itself, then -use its own **Save (API format)** export and replace the values you want Filesmith to fill in with -placeholders. - -Available placeholders: - -`${unet}` `${clip}` `${clip2}` `${vae}` `${model}` · `${prompt}` `${negative}` `${seed}` `${steps}` -`${cfg}` `${guidance}` `${sampler}` `${scheduler}` `${width}` `${height}` `${batch}` `${prefix}` - -A value that is _exactly_ one placeholder is replaced with the raw value, so `"seed": "${seed}"` -yields a number, not a string. Use `workflow` for a bare diffusion model (UNETLoader + separate -encoders) and `checkpointWorkflow` for an all-in-one single-file checkpoint. An entry can have both. - -## What Filesmith will refuse, and why - -Your entry is validated at load. If it fails, that entry is skipped with a warning and the rest of -the registry keeps working — a bad file can never brick the app. - -- `subdir` must be one of `text_encoders`, `clip`, `vae`, `checkpoints`, `diffusion_models`, `unet`, - `upscale_models`. Anything else is rejected: `subdir` and `filename` are joined onto your ComfyUI - models root, so an unconstrained value would be a path-traversal sink. -- `filename` must be a plain name — no `/`, no `\`, no `..`. -- Download URLs must be `https:`. -- A workflow template must be an object of `{class_type, inputs}` nodes, and may only use the - placeholders listed above. -- Workflow templates are **data**. They are parsed as JSON, never evaluated, and the result is only - ever POSTed to a loopback ComfyUI. No entry can cause code to run. -- An entry whose `schemaVersion` is newer than your Filesmith is skipped with a note telling you to - update, rather than crashing the load. - -## Checking your work - -Launch Filesmith and open the Generate panel. Problems with any registry file are reported there. -Your models appear alongside the built-in families; unrecognized files are listed too, so you can -always tell whether Filesmith saw the file at all. - ---- - -# For the maintainer - -## Keeping the shipped hashes current - -Every download in `resources/registry/gen-archs.json` carries a real `sha256` and a URL pinned to -an immutable commit revision, with the `resolve/main` branch URL kept after it as a fallback mirror. - -The hashes are not invented: Hugging Face stores large files in git-LFS, and an LFS object id _is_ -the sha256 of the content, exposed per file by the repo tree API. - -``` -node scripts/registry-hashes.mjs # refresh hashes + pins from upstream -node scripts/registry-hashes.mjs --check # CI-friendly: fails if the pack is stale -``` - -A pinned URL and its hash agree forever, so verification can be strict. The declared hash is -deliberately **not** enforced against the fallback mirror — the branch copy may legitimately hold -different bytes, and rejecting it would defeat the rescue the mirror exists for. A fallback falls -back to trust-on-first-use. - -If a repo is gated or renamed, that one entry is left untouched and reported; it simply keeps -trust-on-first-use, which is where everything was before. - -## Publishing a channel update - -Every companion URL points into someone else's repo. When one is reorganized, every _installed_ -copy of Filesmith gets a 404 and stays broken until a new release ships. The channel fixes that -without a release: publish a signed pack, and every install picks it up within a day. - -It is **off** until a signing key exists, which is the safe default — an unsigned channel would mean -trusting whatever the network returns, and a registry entry can name files to download. - -To turn it on, once: - -``` -node scripts/registry-channel.mjs keygen -``` - -That writes `channel-private.pem` (gitignored — back it up; losing it means no existing install will -ever accept another update) and prints the public key to paste into `CHANNEL_PUBLIC_KEY_B64` in -`src/main/registry/channel.ts`. Then, whenever something upstream moves: - -``` -node scripts/registry-hashes.mjs # pick up the new location -node scripts/registry-channel.mjs sign resources/registry/gen-archs.json -node scripts/registry-channel.mjs verify channel.json -``` - -Publish the resulting `channel.json` at the URL the app checks (`FILESMITH_CHANNEL_URL`; a GitHub -Pages file is enough). Installs check at most once a day, in the background. A bad signature, a -malformed pack or no network all leave the previous cache in place — offline is a first-class state, -never an error. diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..3651b5a --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,128 @@ +# Architecture + +For developers. How Filesmith is put together, where things live, and how a change gets tested and +shipped. User-facing command line docs are in [cli.md](cli.md). + +## Processes + +| Process | Entry | Role | +| -------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Main | `src/main/index.ts` | Electron app, window, IPC handlers (`src/main/ipc.ts`), the job queue and every tool run. All privileged work happens here. | +| Preload | `src/preload/index.ts` | `contextBridge` exposes the typed `window.filesmith` API. The renderer's only way into main. | +| Renderer | `src/renderer/src/main.tsx` | React UI. Never touches `fs` or `child_process`. | +| CLI | `src/cli/bootstrap.ts`, built to `out/main/cli.js` | The same engine as plain Node. The shims in `resources\cli` (`filesmith.cmd`, sh `filesmith`) run `Filesmith.exe` with `ELECTRON_RUN_AS_NODE=1`, so nothing the CLI imports may import `electron`. | +| CLI watchdog | `src/cli/watchdog.ts`, built to `out/main/cliWatchdog.js` | Cleans up outputs and child tools after a CLI that was killed outright. | +| Console runner | `src/main/console/` | The bottom Console strip. Each command forks the bundled `cli.js` (`runCli.ts`); the line is re-validated in main (`validate.ts`) and only `filesmith` verbs run. Stop is staged: interrupt, interrupt again, then a tree kill. | +| Sidecars | `src/main/pid/sidecar.ts`, `src/main/comfy/sidecar.ts` | Long-lived Python processes (PiD, spandrel) kept warm across images, talking newline-delimited JSON. | + +The engine gets its host (userData, resources folder, downloads folder, `fetch`) from `src/main/env.ts` +(`setEngineEnv`). The app fills it from Electron, the CLI from Node. `src/main/boot.ts` holds startup +shared by both. + +## src layout + +``` +src/ + main/ engine and Electron main process + tools/ one module per operation (convert, compress, resize, upscale, removebg, + pdf, archive), plus registry.ts (tool id -> module), plan.ts (dry-run + output names), estimate.ts, readiness.ts, soffice.ts, ncnnModels.ts + console/ Console strip: command catalog, validation, forked CLI runs + generate/ Generate: ComfyUI server, workflows, model scan, preflight + comfy/ ComfyUI discovery, imported upscalers, spandrel sidecar + pid/ PiD upscaler: GPU check, install, warm sidecar + rembg/ rembg install and paths + registry/ three-layer model registry (builtin, channel, user) + net/ downloads and SHA-256 integrity records + jobQueue.ts batch queue with concurrency limits and cancel + output.ts collision-safe output naming + atomicOutput.ts part files and placeholders for every output + toolResolver.ts finds bundled or PATH binaries + session.ts session.json load/save + preload/ typed window.filesmith bridge + renderer/src/ React UI: components/{shell,queue,inspector,options,console,views,ui,icons} + cli/ filesmith CLI: parse, plan, runner, events, commands/{doctor,files,formats, + generate,setup,skill}, watchdog + shared/ types and catalogs used by main, renderer and CLI (types.ts, ipc.ts, + tabs.ts, convert/compress/resize/removebg/archive/generate, console*) +``` + +## How a job flows + +1. The renderer queues files per verb (`src/shared/tabs.ts`) and calls `job:run` through the preload + bridge with a `JobRequest`. +2. `JobQueue` (`src/main/jobQueue.ts`) runs jobs with a global concurrency limit and per-tool caps + (upscale and removebg run one at a time). Each job gets an `AbortController` for cancel. +3. `getTool()` in `src/main/tools/registry.ts` picks the tool module, which builds the arguments and + spawns the CLI tool through `src/main/run.ts`. +4. Progress goes back as `JobEvent`s (`status`, `percent`, `etaSec`, `outputPath`, `outputSize`, + `error`) broadcast on the `job:event` IPC channel. +5. Outputs are atomic (`src/main/atomicOutput.ts`): the final name is reserved first with an empty + placeholder (exclusive create), the tool writes a `.filesmith-part` sibling, and the part is renamed + onto the final name only on success. A failed or canceled job leaves no half-written file. +6. Names are collision-safe (`src/main/output.ts`, ported from RCMM): `name.ext`, then + `name (tag).ext`, `name (tag 2).ext`, and `base (2)` for folders. A source or existing file is + never overwritten. `tools/plan.ts` predicts the same names for dry runs. + +The CLI runs the same tool modules through `src/cli/runner.ts`, not the app's queue, so CLI jobs never +show up in the app. + +## Bundled tools + +- Core tools ship in the installer: ffmpeg, ImageMagick, mutool, CaesiumCLT and 7-Zip in + `resources\bin`, plus `resources\libreoffice`, `resources\ghostscript` and `resources\realesrgan`. + They are not in git. +- `npm run binaries` (`scripts/fetch-binaries.mjs`) stages them, mostly from local installs. + `--pinned` (used by CI) downloads the same versions from official sources, each checked against a + SHA-256 in `scripts/pinned-tools.mjs`. +- `scripts/verify-bundle.mjs` checks every tool is present and runs. +- WinRAR's `Rar.exe` cannot be bundled. It is detected at runtime and RAR/CBR targets are greyed out + without it. + +## AI tools + +- Real-ESRGAN (ncnn/Vulkan) is bundled. Extra models download into `%APPDATA%\Filesmith\models`. +- rembg, PiD and spandrel install on demand with `uv` into `%APPDATA%\Filesmith` (`uv`, `uv-tools`, + `pid`, `models`). The app offers setup in the UI; the CLI never downloads during a job and says + `Run: filesmith setup ` instead. +- Generate drives a local ComfyUI (`filesmith setup comfy --folder` or `--url`). +- Model downloads come from the registry: `resources\registry\*.json` (builtin), a signed channel + layer, and the user layer in `%APPDATA%\Filesmith\registry\user`, which updates never touch. + +## Settings and data + +- userData is `%APPDATA%\Filesmith`, shared by the app and the CLI. `FILESMITH_USER_DATA` overrides it + (tests and CI). +- `session.json` holds queues, results and options (written atomically). +- UI preferences (sidebar order and hidden verbs, sidebar collapsed, view size, console panel) live in + renderer `localStorage`. +- Other files there: `integrity.json`, `comfy-upscalers.json`, `comfy-live.json`, `locks\`. + +## Tests + +- Unit: `npm test` (Vitest, `test\*.test.ts`). `electron` is stubbed by `test/mocks/electron.ts`. + Covers argument builders, catalogs, output naming, CLI parsing, IPC parity, and a no-em-dash check. +- E2E: `npm run build`, then `npm run test:e2e` (Playwright `_electron`, specs in `e2e\`). The app runs + hidden (`FILESMITH_E2E_HIDDEN=1` from `e2e/helpers.ts`), one worker at a time. +- Screenshots: set `FILESMITH_SHOTS=1` to capture shots (for example `e2e/visual.spec.ts` writes to + `docs\mockups\terminal-v5\shots`). They are evidence for design review, not assertions. +- E2E is the local pre-PR gate; CI does not run it. + +## CI and releases + +- `ci.yml` (PRs and pushes to main, `windows-latest`): typecheck, lint, `prettier --check`, unit tests. +- `release.yml` (push to main, except docs-only changes): the same gates, then a check that + `v` from `package.json` does not exist yet, pinned tool fetch, bundle verification before + and after packing, a smoke test of the packed CLI, and `gh release create` with generated notes. + Output: `Filesmith-Setup-x64-.exe` plus a stable-named copy. Unsigned. +- PRs that touch release machinery (`package.json`, scripts, `src/cli`, installer files) get a dry run: + the installer is built and uploaded as a workflow artifact, never published. Bump the version in the + PR, or the dry run fails. + +## Design process + +The look is designed with the owner. Make no visual assumptions: any UI change starts with +self-contained HTML mockups and waits for sign-off. The signed-off target is +`docs\mockups\terminal-v5\10-s2-vscode-grouped.html` (dark only, strict monochrome). The rules and +feedback trail are in [design/redesign-direction.md](design/redesign-direction.md). Feature specs live in +`docs\superpowers\specs`. diff --git a/docs/cli.md b/docs/cli.md index d34fd77..8fc4572 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -63,7 +63,8 @@ filesmith [args] [options] same folder; only a job that succeeds renames it onto the final name. A failed or canceled job removes both. Treat `*.filesmith-part*` entries as work in progress, never as results. - **Output formats.** Human output by default: one line per file (`ok`, `skip`, `fail`) and a summary on - stdout, a progress line on stderr when it is a terminal. `--json` prints NDJSON events on stdout only + stdout, a progress line on stderr when it is a terminal, in the app queue's format + (`[2/5] photo.png 62%(4s)`, `working` when there is no percentage). `--json` prints NDJSON events on stdout only (see below). - **Exit codes.** `0` all ok or skipped; `1` some job failed (or `doctor` found a failure, or `setup` failed); `2` usage error or a requirement that fails for every input, nothing ran; `130` canceled @@ -162,22 +163,31 @@ The source of this table is `resources/skill/filesmith/reference.md` (Events sec ## In-app console The app has a console panel at the bottom of the files view (spec -`docs/superpowers/specs/2026-10-06-console-design.md`). Open or close it with Ctrl+` (anywhere in the -app), the **Console** button in the bottom strip (hidden while the panel is open), or the close X in -the panel's top-right corner. - +`docs/superpowers/specs/2026-10-06-console-design.md`). It runs filesmith commands only; for anything +else, use a terminal. + +- **Open and close.** ``Ctrl+` `` (anywhere in the app, except while a dialog is open) toggles it. The + bottom strip of the centre column holds the **Console** button, which shows the running command's + percentage while the panel is closed; the strip hides while the panel is open. The panel header has + **Clear** (disabled while a command runs) and **Minimise**. Drag the top edge (or focus it and use + Up and Down) to resize. Open state, height, folder and history are remembered. - Type commands without the prefix: `convert *.heic --to webp`, `doctor`, `formats`. The line is split into plain arguments and handed to the CLI; nothing runs through a shell, so `&`, `|` and `>` are just text. Anything that is not a filesmith command is refused, in the panel and again in the main - process. -- Built-ins: `cd ` (the folder commands run in; the last one is remembered, else Downloads), - `clear` (or Ctrl+L), `help`, `history` (the last 100 commands; Up and Down recall them). Tab - completes commands, flags, values and file names. -- One command at a time. Console runs do not join the app's queue, and the queue keeps working while - one runs. Outputs use the same never-overwrite naming as the CLI; a finished run offers **Show in File - Explorer**. -- **Stop** or Ctrl+C cancels a run: the current file is stopped, part files are removed and the run - ends with exit 130. A second Stop ends it at once (the process tree is killed after 5 s at most). + process. `-` (file names from stdin) is refused too. +- Built-ins: `cd ` (the folder commands run in; `cd -` goes back, `cd ~` is your user folder, + `cd D:` a drive root; the last folder is remembered, else Downloads), `clear` (or Ctrl+L), `help`, + `history` (the last 100 commands; Up and Down recall them). Tab completes commands, flags, values and + file names. +- Output is the CLI's human output, with a progress line in the queue's format (`photo.png 62%(4s)`) + and a bar. Each finished command shows `exit ` and its time. A finished run with outputs offers + **Show in File Explorer**; right-click an output line for **Show in File Explorer** and **Open in + default app**. +- One command at a time. Console runs do not join the app's queue or the Completed view, and the queue + keeps working while one runs. Outputs use the same never-overwrite naming as the CLI. +- **Stop** (in the header while a command runs) or Ctrl+C cancels a run: the current file is stopped, + part files are removed and the run ends with exit 130. A second Stop ends it at once (the process + tree is killed after 5 s at most). With nothing running, Ctrl+C clears the input. - Plumbing: each command forks `out/main/cli.js` with `ELECTRON_RUN_AS_NODE`. When `CliIO.events` is set, the CLI tees its NDJSON events to it; under a fork they travel over the IPC channel. The parent cancels with the `'interrupt'` IPC message (twice for a hard stop), never with a console Ctrl+C. diff --git a/docs/comfyui-upscaler-import.md b/docs/comfyui-upscaler-import.md deleted file mode 100644 index 6d73ea9..0000000 --- a/docs/comfyui-upscaler-import.md +++ /dev/null @@ -1,133 +0,0 @@ -# ComfyUI Upscaler Import - -## Goal - -Let a user point Filesmith at their ComfyUI install and use the ESRGAN-family -image-upscale models they already have (4x-UltraSharp, Remacri, NMKD, AnimeSharp, -RealESRGAN variants, …) directly inside Filesmith — no ComfyUI running, no -workflow engine. Models are loaded with **spandrel** (the exact loader ComfyUI -uses) and run through our own tiled upscaler. - -## Why this over bundling - -- **Licensing**: most good community upscalers are non-commercial (CC-BY-NC-SA), - so we can't ship them. Running the user's _own_ files is distribution-free. -- **VRAM**: tiled ESRGAN inference is bounded, so it avoids the large-output - blow-ups the diffusion path (PiD) hits. -- **Coverage**: spandrel auto-detects architecture, so one code path handles the - hundreds of community upscalers. - -## Decisions (agreed) - -1. **Import policy** — load anything spandrel accepts; badge known-good models - **Verified**, the rest **Experimental**; diffusion/unloadable files are shown - greyed as **Unsupported** with the reason. -2. **Placement** — imported models sit _alongside_ the existing options - (Photo / Anime bundled Real-ESRGAN, PiD). Nothing is removed. PiD keeps its - own diffusion path (and its pending input-resize fix). -3. **Storage** — **reference in place**: read models straight from the ComfyUI - folder, nothing copied. Remember the folder; offer Rescan / Change folder. - -## We load files, not workflows - -We do **not** execute ComfyUI graphs. We read `models/upscale_models/*.pth` -(and `.safetensors`), load each with `spandrel.ModelLoader().load_from_file()`, -which returns a wrapped model plus its architecture and native scale, and run a -tiled forward pass ourselves. - -## Architecture - -### Engine — a spandrel sidecar (NVIDIA / torch) - -- Reuses the existing PiD torch env (`/pid/repo/.venv`, torch 2.10 - cu128) with `spandrel` added — no second multi-GB install. If PiD isn't - installed, the first ComfyUI import triggers the same env bootstrap (env only, - no PiD weights). -- `resources/spandrel/spandrel_server.py`: a resident sidecar mirroring the PiD - one (newline-JSON over stdin/stdout, id-framed, kept warm). Requests: - `{"id","model_path","input","output","tile","scale_to"}`. Loads the model once - per path (cache by path), tiles the input with overlap, upscales, stitches, - optionally resamples to a target size, saves PNG, returns `{ok, output, ms}`. -- **Tiling**: default 512 px tiles, 32 px overlap; auto-halve tile size and retry - on CUDA OOM so any image size succeeds within VRAM. -- **Alpha**: reuse the existing `restoreAlpha` step (ESRGAN models are RGB). -- Gated on an NVIDIA GPU, like PiD. Non-NVIDIA users keep bundled Real-ESRGAN. - (Cross-GPU via ONNX/DirectML is a later, separate track — out of scope here.) - -### Discovery — `src/main/comfy/discover.ts` - -- User picks a folder: the ComfyUI root, a `models/` dir, or an - `upscale_models/` dir — all accepted. We resolve `upscale_models/` under it, - and also parse `extra_model_paths.yaml` at the root (if present) to pick up - additional upscale-model paths (the shared-folder case). -- Scan for `*.pth` / `*.safetensors`. For each, a cheap **CPU** probe via - spandrel identifies architecture + native scale WITHOUT running on GPU - (`spandrel_server.py --probe ` → `{arch, scale, ok, reason}`). -- Classify: - - **Verified** — filename stem (case-folded) or SHA-256 matches a bundled - `verified-upscalers.json` allow-list (UltraSharp/UltraSharpV2, Remacri, - Siax/NMKD, 4x-AnimeSharp, RealESRGAN x4plus/anime, LSDIR, …). - - **Experimental** — spandrel loaded it (known arch) but it's not on the list. - - **Unsupported** — spandrel can't load it (diffusion checkpoints, LoRAs, VAEs, - unknown arch) → greyed with the reason. - -### Persistence — `src/main/comfy/store.ts` - -- `/comfy-upscalers.json`: remembered root folder + the last scan - result (path, name, arch, scale, badge, hash). Referenced in place; a Rescan - re-probes and drops models whose files disappeared. - -### IPC / preload - -- `comfy:pick-folder` (dialog), `comfy:scan` (returns the classified list), - `comfy:status` (remembered folder + count). Streamed scan progress for the - probe pass. - -### UI - -- **Upscale options** model row gains a divider and the imported models beneath - Photo / Anime / PiD, each with its badge (✔ Verified / ⚠ Experimental) and - native scale. An **“Import from ComfyUI…”** affordance opens the folder picker; - if none imported yet, a compact call-to-action card (mirrors the PiD install - card) explains the one-time folder select. Unsupported files are listed greyed - under a “Not usable” disclosure so the user isn't confused about omissions. -- **Scale**: when an imported model is selected, the scale control shows the - model's **native** scale (e.g. 4×). If the user still wants 2×/3×, we upscale - at native then Lanczos-resample down (stated in the output preview). First-use - Experimental models show a one-line “not vetted — may error” note. -- **Progress**: tiled upscaling reports a **measured** percentage - (tiles done / total) — genuinely accurate, plus the estimate helper as a floor. - -## Plan (phased, each independently testable) - -1. **Spandrel in the env + probe** — add `spandrel` to the torch env bootstrap; - `spandrel_server.py` with `--probe` (CPU arch/scale ID) and a resident - upscale loop (tiling + OOM backoff). Unit-test the tiler math + protocol - framing (no GPU). -2. **Discovery + classification** — `discover.ts` (folder resolve, - `extra_model_paths.yaml` parse, scan), `verified-upscalers.json`, badge - classifier. Unit-test path resolution + classification against fixtures. -3. **Store + IPC + preload** — persistence, `comfy:pick-folder/scan/status`, - preload surface, typed results. -4. **Engine wiring** — `comfy/sidecar.ts` (spandrel sidecar client, id-framed, - AbortSignal, warm), `upscaleWithComfy(file, modelPath, scaleTo, ctx)` in the - tool registry; route `options.upscaleModel === 'comfy:'` to it; alpha + - measured tile progress. -5. **UI** — imported models in the picker with badges, folder-select / rescan, - native-scale handling, Experimental note, Unsupported disclosure. -6. **Confirmation** — one GPU run on 4x-UltraSharpV2 (with permission), timed. - -## Verification - -- Non-GPU unit tests: tiler geometry, protocol framing, folder/`extra_model_paths` - resolution, badge classification (fixtures for verified/experimental/unsupported). -- Typecheck / lint / build green each phase. -- Final: one permissioned GPU upscale through 4x-UltraSharpV2. - -## Out of scope (v1) - -- Running ComfyUI workflows / graphs. -- Diffusion upscalers other than PiD (SUPIR, SeedVR2) — each needs its own - pipeline. -- Cross-GPU (AMD/Intel) execution of imported models (ONNX/DirectML) — later. -- Copying/managing models; face-restore or multi-pass chains. diff --git a/docs/compression-upgrade-plan.md b/docs/compression-upgrade-plan.md deleted file mode 100644 index aa8dccb..0000000 --- a/docs/compression-upgrade-plan.md +++ /dev/null @@ -1,189 +0,0 @@ -# Compression upgrade plan - -A running design doc for expanding the **Compress** tab, decided category by -category with the user. Status per section: DECIDED / discussing / TODO. - -**STATUS: IMPLEMENTED** (images, video, audio, PDF). Engine + per-kind options UI - -- live video-resolution preview + Ghostscript/ffprobe bundling all landed and - verified end-to-end against the real binaries. Possible follow-up: allow WAV/FLAC - into audio Compress (wav→opus is a big win), currently excluded by canCompress. - -Current baseline (what the Compress tab does today): - -- Images: CaesiumCLT (jpg/png/webp/gif/tiff) + ImageMagick fallback, re-encode at - a quality value, **same format in/out**. -- Video: ffmpeg CRF, x264 (VP9 for webm), fixed 128k AAC audio, one quality slider. -- Audio: ffmpeg re-encode to the same codec at a bitrate. -- PDF: `mutool clean -gggg -z` (deflate streams + garbage-collect; no image downsampling). - ---- - -## 1. Images — DECIDED - -Add a **Format** choice to the image Compress options. Three options: - -1. **Keep format** (default) — re-encode in the source format at the quality - slider. This is exactly today's behavior (CaesiumCLT / ImageMagick). Lossy. -2. **WebP (compatible)** — convert to WebP, **lossy** (quality-slider driven). - Fast, opens basically everywhere, keeps transparency. The "just make it - smaller and it'll work anywhere" option. -3. **AVIF (smallest)** — convert to AVIF, **lossy** (quality-slider driven). - Best compression (~40-60% smaller than WebP), slower to encode, slightly - narrower compatibility. The "squeeze it as hard as possible" option. - -Key decisions: - -- **Both new formats run in LOSSY mode**, driven by the existing quality slider. - Rationale: a Compress button should reliably make files smaller; lossy is - where the big wins are for photos (the common case). Lossless WebP/AVIF only - helps graphics and can make photos _larger_, so it's not offered here. -- **No "→ JPEG" option in Compress.** Converting to JPEG is a footgun on - transparency / sharp edges; that belongs in the Convert tool. -- Perfect-quality (lossless) format conversion, if ever wanted, also belongs in - Convert, not Compress. - -Implementation notes: - -- ImageMagick (already bundled) can already encode WebP and AVIF at `-quality` - (verified in the conversion matrix), so an **MVP needs no new binary** — route - the WebP/AVIF options through magick with the mapped quality. -- Optional later upgrade: bundle `cwebp` (libwebp) and `avifenc` (libavif) for - finer quality/effort control and better speed than magick's built-ins. -- The output extension follows the chosen format (`name (compressed).webp` etc.); - "Keep format" keeps the source extension as today. -- Transparency is preserved in lossy WebP/AVIF (unlike JPEG). - -Second-wave / not now (nice-to-have specialists): - -- mozjpeg (better JPEG encoder, 10-30% smaller), oxipng / pngquant (PNG lossless - / palette), gifsicle (GIF). Bigger, format-specific wins; revisit later. -- "Strip metadata" toggle (EXIF/ICC/XMP) — cheap, always helps a little. - ---- - -## 2. Video — DECIDED - -Three independent controls in the video Compress options: - -### a. Codec (the biggest lever) — same "compatible / smaller / smallest" framing as images - -1. **H.264 (compatible)** — universal, plays everywhere, least efficient. Today's - default. ffmpeg `libx264`. -2. **H.265 / HEVC (smaller)** — ~30-50% smaller than H.264 at equal quality, - slower encode, well supported. ffmpeg `libx265` (mp4 with `-tag:v hvc1` for - Apple compatibility). -3. **AV1 (smallest)** — another ~20-35% smaller than H.265, slowest encode, - narrower support. ffmpeg `libsvtav1` (fast AV1 encoder). The bundled gyan.dev - essentials ffmpeg includes SVT-AV1 (verified). - -- **Output is always .mp4**, driven by the chosen codec (H.264/H.265/AV1 all mux - there). The codec picker replaces the old auto-VP9-for-WebM behavior: a `.webm` - source is re-encoded to `.mp4` with the selected codec. (No VP9 option is - offered; VP9/WebM output would be a Convert-tool concern if ever wanted.) - -### b. Quality — the existing slider - -- Maps to CRF per codec (the CRF scale differs by codec: ~18-32 for x264/x265, - higher numbers for AV1, so use a per-codec mapping, not one shared range). - -### c. Resolution — presets + live output list - -- Presets: **Original / 1440p / 1080p / 720p / 480p / 360p / 240p**. -- Each preset means "fit within that box, **preserve aspect ratio, never - upscale**" — so it works for any shape (landscape, portrait, ultrawide) and any - mix of inputs in a multiselect (everyone capped to the ceiling; anything - already smaller is left alone). No stretching. -- ffmpeg idiom (downscale-only fit, even dimensions): - `scale='min(TW,iw)':'min(TH,ih)':force_original_aspect_ratio=decrease:force_divisible_by=2` -- **Live "Output" list in the sidebar** showing each selected file's real result, - updating as the setting changes: - ``` - clip1.mp4 1920×1080 → 1280×720 - vertical.mp4 1080×1920 → 405×720 - wide.mov 2560×1080 → 1280×540 - ``` - Needs each input's dimensions — bundle `ffprobe` (tiny, ships with ffmpeg) or - do a quick probe. Kills all ambiguity about what "720p" does per file. -- Optional later: a percentage / custom-dimensions mode for power users. - -### Audio track (inside video) - -- MVP: keep the current fixed AAC 128k. Optionally expose audio bitrate / "remove - audio" later, reusing the audio-category decisions below. - -## 3. Audio — DECIDED - -Two controls in the audio Compress options. (Audio Compress only applies to -lossy formats — mp3/m4a/aac/ogg/opus/wma; lossless flac/wav are excluded by -`canCompress`, as today.) All via bundled ffmpeg, no new tools. - -### a. Codec / format picker — parenthetical labels for the tradeoff - -1. **MP3 (compatible)** — universal, least efficient. `libmp3lame`. -2. **AAC (balanced)** — better quality per byte, widely supported (`.m4a`). ffmpeg `aac`. -3. **Opus (smallest)** — most efficient (~40-60% smaller at equal quality), - especially at low bitrates; fine on modern devices. `libopus`. - -- "Keep format" behavior can remain the default (re-encode in the source codec), - with MP3/AAC/Opus as explicit targets. - -### b. Bitrate picker (replaces the quality slider for audio) - -- User picks the **bitrate directly**, shown in kbps (not an abstract quality - slider). Preset values: **320 / 256 / 192 / 128 / 96 / 64 kbps** (default ~192). -- ffmpeg `-b:a k`. Lower bitrate = smaller file; Opus stays clean lower than - MP3/AAC. - -### Explicitly NOT doing (this round) - -- **No "already-compressed" warning.** (User decision.) -- Sample-rate reduction / stereo→mono downmix / Voice-Podcast-Music presets: - deferred, revisit later if wanted. - -## 4. PDF — DECIDED - -Bundle **Ghostscript** (`gs`) — the only mature offline single-binary tool that -downsamples the _images inside_ a PDF (mutool/qpdf only touch structure, which is -why today's compress does almost nothing on scanned / image-heavy PDFs). Worth -the ~60 MB. License: AGPL, compatible since Filesmith is open-source and already -ships GPL ffmpeg (no network service, so AGPL's extra clause doesn't bite). - -### a. Compression level picker — default Balanced - -- **Lossless** — today's `mutool clean -gggg -z`. No image changes, safe, small - savings. Best for text-only PDFs / when you don't want to risk altering render. -- **High quality** (~300 dpi) — Ghostscript `-dPDFSETTINGS=/printer`. Downsamples - images but keeps print-grade sharpness; minimal visible loss. -- **Balanced** (~150 dpi) — Ghostscript `-dPDFSETTINGS=/ebook`. **Default.** Looks - great on screen, big savings. What most people want. -- **Smallest** (~72 dpi) — Ghostscript `-dPDFSETTINGS=/screen`. Aggressive, - visibly softer, tiny files. -- Why keep Lossless(mutool) alongside the gs tiers: gs re-renders the whole PDF - through its own engine (great for shrinking, occasionally rewrites things); - mutool is the conservative "shrink without altering" pass. - -### b. Grayscale toggle — optional, OFF by default - -- Converts color → grayscale for docs that don't need color (scanned documents to - email). ~30-50% extra. Ghostscript `-sColorConversionStrategy=Gray --sProcessColorModel=DeviceGray`. Off by default so it never surprises anyone. - -Base gs invocation: -`gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ -dNOPAUSE -dBATCH -dQUIET -o out.pdf in.pdf` - -## 5. General / archive compression — SKIPPED (out of scope) - -Decided NOT to add zip/7z/zstd archiving. Compress stays **media-only** -(images / video / audio / PDF). Arbitrary-file and folder archiving is out of -scope; the output-is-an-archive model is a different mental model than -"compress → still-usable smaller file", and it isn't wanted here. - ---- - -## UI polish (not compression-specific) - -- **Sidebar empty state:** when nothing is selected (no files, or files present - but none selected), the options panel must NOT assume a kind / show bogus - choices like "convert to PNG". Show a "No files selected" placeholder instead - and reveal the real options once a file is selected. (Fixed separately.) diff --git a/docs/dependency-model-audit.md b/docs/dependency-model-audit.md deleted file mode 100644 index bb5aeba..0000000 --- a/docs/dependency-model-audit.md +++ /dev/null @@ -1,1332 +0,0 @@ -# Filesmith: dependency and model-extensibility audit - -Scope: can a person who is not the developer install this and use it, and can that person add a new -AI model without waiting for an app release? Six subsystem audits (bundled tools, on-demand -download, ComfyUI integration, model generalization, security, fresh-user UX) were run, each -adversarially filtered, then reconciled here. Every file:line below was read. - ---- - -## 1. Verdict - -**The core of Filesmith ships and works for a stranger. The AI half does not generalize.** Convert, -compress, resize, PDF and document conversion are bundled, spawned safely with argv arrays -(`src/main/run.ts:24`), never overwrite a user file (`src/main/output.ts:43-63`), and keep all -mutable state in `userData`. A fresh user on a machine with none of your setup gets a working file -toolkit on day one. That is a real achievement and most of this report is not about it. - -**The AI layer is a snapshot of your machine on the day you built it.** Five architectures live in -a TypeScript union (`src/shared/genArch.ts:14`), four of them are runnable -(`src/main/generate/models.ts:16`), each with a hand-written ComfyUI graph and eight hardcoded -Hugging Face `resolve/main` URLs (`src/main/generate/archRegistry.ts:26-141`). Two Real-ESRGAN -model names are frozen at build time (`scripts/fetch-binaries.mjs:255`, `src/main/tools/upscale.ts:13`). -One PiD backbone is hardcoded down to the IPC call (`src/main/pid/paths.ts:84-91`, `src/main/ipc.ts:180`). -Four rembg sessions are a compile-time union (`src/shared/removebg.ts:22`). **There is no file -anywhere on disk that a user can edit to add a model.** Every one of those additions is a code -change plus a signed release. - -**Two things will bite a stranger before they ever get to models.** A build made on any machine -but yours silently ships without LibreOffice, Ghostscript or Real-ESRGAN, because the packaging -gate checks only five flat exes (`scripts/fetch-binaries.mjs:342`) while three tree-shaped tools -ride `extraResources` unchecked (`electron-builder.yml:22-34`), and electron-builder only _warns_ -on a missing source. And a user whose ComfyUI is not in the ~35 guessed paths has no way to tell -the app where it is: the only folder picker in the entire renderer is behind an NVIDIA gate -(`OptionsPanel.tsx:405`) _and_ behind a 3 GB engine download (`ComfyImport.tsx:81`). - -**One hard bug**: a space in `%TEMP%` breaks every document conversion, reproduced by direct -execution of the bundled `soffice.com` (`src/main/tools/soffice.ts:28`). - -The good news is that the correct pattern already exists in this codebase, twice. The spandrel -upscaler import probes the actual file and lets unknown architectures through with an -"experimental" badge (`src/main/comfy/discover.ts:275-323`, `src/shared/comfy.ts:57-72`). The -architecture scanner classifies by safetensors tensor keys, not filenames -(`src/main/generate/archScan.ts:76-105`). The whole fix is to make the rest of the app behave like -those two files. - ---- - -## 2. What already works - -An honest baseline. These are not consolations, they are the parts you should not touch. - -### Process execution and file safety - -- **No shell, anywhere.** Zero `shell: true`, zero `exec`/`execSync`/`spawnSync` across `src/`. - Every spawn goes through `run.ts:24` with an argv array and `windowsHide`. A filename containing - `& rd /s /q C:\`, quotes or `$(...)` is inert. This is the single biggest correctness win for - arbitrary user paths, and it also removes the injection surface entirely. -- **Output naming cannot clobber.** `output.ts:43-63` claims names with an exclusive - `openSync(cand, 'wx')`, so concurrent queue jobs racing the same target diverge rather than - overwrite. `registry.ts:85-118` deletes the placeholder on any failure or cancel and treats a - 0-byte result as failure, so a missing tool never leaves junk beside the source. -- **Prompts and filenames never reach argv.** The generate prompt travels as JSON inside the - workflow body (`generate/comfy.ts:192-196`); the output name goes through a hard slug - (`generate/index.ts:26-34`). Sidecar paths travel as JSON over stdin (`pid/sidecar.ts:198`). - -### Packaging and paths - -- One consistent dev-vs-packaged rule across all six resource trees - (`toolResolver.ts:10-14, 33-36, 61-64, 89-93`; `pid/paths.ts:48-59`), verified to hold in both - modes with no drift. -- `electron-builder.yml:15` excludes `resources/**` from the app files while shipping via - `extraResources`. This halves the installer and keeps binaries as real on-disk files, avoiding - the classic "binary inside asar cannot be spawned" trap with no `asarUnpack` needed. -- LibreOffice is invoked correctly on Windows: an isolated per-conversion - `-env:UserInstallation` profile, `soffice.com` preferred over `.exe` so the call actually - blocks, and `txt:Text (encoded):UTF8` forced so non-ASCII export is not mangled - (`tools/soffice.ts:22-44`). - -### Downloads - -- Genuinely atomic and never mistakable for complete: stream to `.part`, verify byte count - against Content-Length, delete the part on any failure, rename last - (`net/download.ts:47-80`, `pid/install.ts:87-116`). -- `net/download.ts` has exactly the right defensive set for model files: a 401/403 branch telling - the user to accept the license on the model page (`:34-38`), rejection of an HTML/JSON body - served as 200 (`:41-43`), and a `minBytes` floor fed from the catalog's advertised size - (`companions.ts:66`). This file is the reference implementation. It just needs hashes, and - `pid/install.ts` needs to stop forking it. -- Idle-stall watchdog re-arms on every chunk and aborts a half-open socket after 60s, so a dead - connection reports "Download stalled" instead of hanging the modal forever. -- Phase markers are written only after a phase fully completes, and readiness gates on the marker - rather than on an artifact that appears early: `paths.ts:39-44` gates on `pidEnvMarker()` - instead of `python.exe`, which `uv` creates before the ~3 GB torch pull. An interrupted install - resumes cleanly instead of reading as a torch-less success. - -### Model identification (the part that already generalizes) - -- **Architecture is inferred from the file, not the name.** `archScan.ts:21` reads the 8-byte - length plus JSON header, capped at 16 MB against a hostile length field; `classifyArch` - (`:76-105`) decides from tensor-key signatures. A new _finetune_ of a known family works with - zero code change. Declared `modelspec.architecture` is preferred where present (`:72`). -- Non-image DiTs (video/3D/audio) are positively excluded before the image checks - (`archScan.ts:113-125`), with regression tests for HunyuanVideo, FramePack, Hunyuan3D, Wan and - LTX (`test/arch-scan.test.ts:104-119`). -- Flux 2's encoder size is chosen from the file's **byte size**, not its filename - (`archRegistry.ts:115`), explicitly rename-safe and tested (`test/gen-registry.test.ts:25`). -- **Imported upscalers are fully arch-agnostic.** `probeModels` (`discover.ts:275-323`) loads each - file with spandrel on CPU to get its real architecture and native scale, with a 120s watchdog so - one bad file cannot wedge a scan. Unknown-but-loadable models stay usable and are merely badged - `experimental` (`shared/comfy.ts:57-72`); `VERIFIED_TOKENS` changes a badge, never availability. - The code even documents the lesson at `discover.ts:205-207`: "Show every checkpoint, name-based - filtering was unreliable." **This is the design the rest of the app should copy.** -- `scanModelFiles` (`discover.ts:243-247`) has the correct symlink-cycle guard - (`resolve(dir)` into a `visited` set). Three sibling walkers are missing it (see §3). - -### Live reconciliation - -- `resolveAgainstComfy` (`preflight.ts:31-39, 77-131`) fetches `/object_info` before queueing, - validates every node class and every CLIPLoader `type` enum value, and resolves each of our - filesystem names to the exact string ComfyUI reports, separator- and case-insensitively. A wrong - path separator can never reach the queue and the user gets an actionable message instead of a - raw HTTP 400. This is rare and excellent. - -### Not downloading things it does not need - -- `findComfyPidWeights` (`discover.ts:214-237`) reuses a ComfyUI user's existing PiD weights with - 2 GB / 200 MB size floors, saving ~3 GB. `pythonEnv.ts:96-106` runs the spandrel sidecar in the - user's **own** ComfyUI Python when it has torch and spandrel, so many ComfyUI users need no - multi-GB install at all. Models are referenced in place, never copied (`comfy/store.ts:6-8`). - -### Honest, up-front disclosure - -- Cost and license are stated **before** the user commits: `PidUpscale.tsx:36-40` leads with - "non-commercial use only" and "~6 GB"; `OptionsPanel.tsx:673-684` warns about the rembg - first-run download before files are queued. -- Capability gating is real runtime probing, not assumption: `pid/gpu.ts:37-51` shells `nvidia-smi` - and caches; a stored AI selection self-heals to a working default when it becomes invalid - (`OptionsPanel.tsx:431-437`). -- The three best error messages in the app are the model for everything else: LibreOffice - (`registry.ts:194-198`), uv/rembg (`registry.ts:874-878`), and the no-Vulkan-device case - (`registry.ts:838-844`), which pattern-matches the driver error and rewrites it. - -### Electron security posture - -- Defaults left secure: no `nodeIntegration: true`, no `contextIsolation: false`, no - `webSecurity: false`, zero `NODE_TLS_REJECT_UNAUTHORIZED` / `rejectUnauthorized` / - `certificate-error` handlers. A real CSP ships (`renderer/index.html:8`, - `default-src 'self'; script-src 'self'`). `will-navigate` is guarded on both windows. The - markdown preview sanitizes properly (`renderer/src/lib/markdown.ts:55-70, 109-114`). -- The renderer is not trusted with model identity: `bgModelOf()` re-validates the rembg model - against the allowlist in main (`tools/removebg.ts:18-21`), and `upscaleWithComfy` re-validates a - renderer-supplied model path against the on-disk store (`registry.ts:739`). - -### State portability - -- Everything mutable lives under `app.getPath('userData')`: `session.json`, - `comfy-upscalers.json`, the PiD env and weights, the generated extra-model-paths YAML. Nothing - is written next to the exe. Per-user NSIS install needs no admin rights. Single-instance lock - (`index.ts:178`), age-guarded temp sweep (`index.ts:15-31`), and `before-quit` cancels in-flight - jobs and frees the sidecars holding VRAM (`index.ts:207-211`). - ---- - -## 3. Blocking gaps for a fresh user - -Ranked by (fresh-user impact) x (how many people it hits). Model-extensibility findings are §4. - -### H1. A space in `%TEMP%` crashes every document conversion - -**`src/main/tools/soffice.ts:28`** ・ severity **high** ・ breaks for: **any user whose account name -contains a space** ("John Smith"), or who redirected TEMP to a spaced path. - -```ts -const profileUrl = 'file:///' + profileDir.replace(/\\/g, '/') -``` - -A raw string splice with no URL encoding. `registry.ts:184-191` builds the profile under -`mkdtempSync(join(tmpdir(), 'filesmith-doc-'))`, so it inherits `%TEMP%`. - -Reproduced by direct execution against the repo's own `resources/libreoffice/program/soffice.com` -with the exact argv `buildSofficeArgs` emits, varying only the profile dir: - -| profile URL | result | -| ------------------------------ | ---------------------------------------------------------------------------------- | -| `file:///C:/.../p1/profile` | status 0, `in.pdf` written | -| `file:///C:/.../p2/pro file` | **status 3765269347 (0xE06D7363, C++ exception), no PDF, empty stdout AND stderr** | -| `file:///C:/.../p3/pro%20file` | status 0, `in.pdf` written | - -Because stderr is empty, `registry.ts:202-207` falls through to the generic "LibreOffice couldn't -convert to PDF" with no diagnostic. A `#` in the profile path makes `soffice.bin` **hang -indefinitely** instead, and there is no timeout anywhere in `run.ts`. Non-ASCII is _not_ affected: -accented and Cyrillic profile dirs both converted fine, so this is specifically an -unencoded-space/`#` bug, not an encoding bug. - -**Fix**: `import { pathToFileURL } from 'url'` and use `pathToFileURL(profileDir).href`. Add a -test in `test/documents.test.ts` asserting `buildSofficeArgs` percent-encodes a spaced profile path. -One line, one test. - ---- - -### H2. A build made anywhere but your machine silently ships without LibreOffice, Ghostscript or Real-ESRGAN - -**`scripts/fetch-binaries.mjs:342`** and **`electron-builder.yml:26`** ・ severity **high** ・ breaks -for: **every end user of any installer built on a machine lacking those trees**, and any -contributor or CI cutting a release from a fresh clone (`resources/` is gitignored). - -The build gate requires only the flat exes: - -```js -const required = ['magick.exe', 'ffmpeg.exe', 'ffprobe.exe', 'caesiumclt.exe', 'mutool.exe'] -``` - -The three tree-shaped tools are declared as `extraResources` (`electron-builder.yml:22-34`) but -never asserted. Reading `node_modules/app-builder-lib/out/fileMatcher.js` `copyFiles()`: -`if (fromStat == null) { log.warn(...); return }`. **A missing source only warns.** Meanwhile -`bundleLibreOffice` (`:150`), `bundleGhostscript` (`:182`) and `bundleRealesrgan` (`:257`) each -warn-and-return on failure. So `npm run package` exits 0 and produces a `Setup.exe` with dead AI -upscale and dead PDF compress. - -LibreOffice is the deterministic case: `bundleLibreOffice` copies from -`['C:\Program Files\LibreOffice', 'C:\Program Files (x86)\LibreOffice', $LIBREOFFICE_DIR]` and has -**no download fallback at all**. Ghostscript and Real-ESRGAN do have download fallbacks -(`:215-246`, `:288-308`), so they usually survive; gs only fails when 7-Zip is also absent. - -Severity nuance: LibreOffice **degrades gracefully** at runtime because `registry.ts:193-198` -catches the spawn rejection and shows a real install message. Ghostscript (`registry.ts:471`) and -Real-ESRGAN (`registry.ts:833`) have no such handling, which is finding M3. - -**Fix**: extend the required-check to the trees, not just the flat exes. Assert -`resources/libreoffice/program/soffice.com`, `resources/ghostscript/bin/gswin64c.exe`, -`resources/realesrgan/realesrgan-ncnn-vulkan.exe` and at least one `models/*.param`, exiting 1 with -the same loud message. If a tree is deliberately optional for a build, make it an explicit -`--skip=` flag that **also drops the `extraResources` entry** so electron-builder never warns -past a missing source. - ---- - -### H3. There is no way to tell Filesmith where ComfyUI is, unless you have an NVIDIA GPU and download 3 GB first - -**`src/renderer/src/components/OptionsPanel.tsx:405, 974`** and **`ComfyImport.tsx:81`** ・ severity -**high** ・ breaks for: **any user whose ComfyUI is outside the ~35 guessed paths** (F:/G:/a NAS, -`C:\AI\comfy`, a OneDrive-redirected Documents, a dev checkout), and **every non-NVIDIA ComfyUI -user**, who can never reach the picker at all. - -Discovery is pure path guessing, and the same literal list appears three times with drift already -visible between the copies (`discover.ts:21-36`, `discover.ts:147-148`, `pythonEnv.ts:43-44`): - -``` -roots = [home, Desktop, Documents, Downloads, 'C:\', 'D:\', 'E:\'] -names = ['ComfyUI', 'ComfyUI-Shared', 'ComfyUI-Installs', 'ComfyUI_windows_portable', 'comfyui'] -``` - -`ComfyUI-Shared` and `ComfyUI-Installs` are your machine's folder names. - -The only `comfy:pick-folder` caller in the entire renderer is `ComfyImport.tsx:61`. That card -renders only when `category === 'comfy'`, which requires `hasNvidia` -(`OptionsPanel.tsx:405: [...UPSCALE_MODELS, ...(hasNvidia ? [UPSCALE_COMFY] : [])]`). And inside -the card, the Browse button renders only when `status.engineReady` (`ComfyImport.tsx:81`); -otherwise the user sees only "Set up upscale engine (~3 GB)". `engineReady` is -`comfyEngineReady() || comfyPythonReady()` (`ipc.ts:206`), and `comfyPythonReady` depends on the -same failed guess. **So the user whose path was not guessed must download 3 GB before the app will -let them point at the ComfyUI they already have.** That is a chicken-and-egg. - -The Generate panel has no picker at all, only dead-end text (`OptionsPanel.tsx:974`): "ComfyUI -wasn't found. Open ComfyUI once so Filesmith can locate it, then reopen this." Nothing in the code -implements that: availability is a filesystem walk (`generate/comfy.ts:73-75`), never a probe of a -running server. There is no Settings screen anywhere in `src/renderer/src/components`. - -`comfy:scan` (`ipc.ts:241-252`) is the **only** writer of `writeComfyStore({folder})`, and that -stored folder is the sole non-guessed input to `comfyModelsBases()` and `comfyCodeRoots()`, which -drive the entire generation feature. - -**Fix**: promote "ComfyUI location" to a first-class setting, reachable from a Settings surface -**and** inline in the Generate panel whenever `generate:status.available === false`. Un-gate the -Browse button from both `hasNvidia` and `engineReady` (ComfyUI is not NVIDIA-only, and picking the -folder is what _makes_ discovery work). One pick then fixes generate, upscale and companion -downloads together, since they all read the same store first. - ---- - -### H4. ComfyUI Desktop installs can never be auto-launched, and are reported "not found" forever - -**`src/main/comfy/pythonEnv.ts:86`** ・ severity **high** ・ breaks for: **anyone who installed -ComfyUI via the official Desktop installer**, precisely the non-technical target user, whenever the -Desktop app is not already running. - -```ts -if (existsSync(py) && hasTorch(py) && existsSync(join(root, 'main.py'))) return py -``` - -This requires `main.py` in the **same root** as the interpreter. `comfyCodeRoots()`'s `add()` only -pushes `d`, `d/ComfyUI`, `d/ComfyUI/ComfyUI` (`pythonEnv.ts:38`). The Desktop layout puts a uv venv -in the user's chosen base dir while ComfyUI's source lives under the Electron app's -`resources/ComfyUI`, so no probed depth ever reaches it, even though `:49` correctly adds -`%LOCALAPPDATA%\Programs\@comfyorgcomfyui-electron`. `findComfyLaunch()` then re-derives three cwd -candidates (`generate/comfy.ts:23-29`), none containing `main.py`, and returns null. -`comfyGenerationAvailable()` is a pure filesystem check that never probes a live server, so -`generate:status.available` stays false forever and the banner never clears. - -Partial mitigation worth knowing: `ensureComfyServer` **does** probe 8188 first -(`generate/comfy.ts:79-82`) and generation is not gated on `available` (`App.tsx:538` calls -`generateRun` unconditionally), so a Desktop user with the app open on 8188 can still generate. The -permanently broken parts are auto-launch and the availability notice. - -**Fix**: add `resources/ComfyUI` and `resources/app/ComfyUI` to the `add()` depths, and decouple -interpreter from code root by searching for `main.py` independently under each candidate root at -bounded depth (~3). Independently, make `comfyGenerationAvailable()` also return true when a server -answers `/system_stats`. - ---- - -### M1. ComfyUI port is fixed at 8188/8199, and the launched child's piped stdio is never read - -**`src/main/generate/comfy.ts:79, 92`** ・ severity **medium, but the stdio half is a live hang** - -```ts -for (const p of [8188, FS_PORT]) - // FS_PORT = 8199, comfy.ts:13 - proc = spawn(launch.python, args, { cwd, windowsHide: true, env }) // comfy.ts:92 -``` - -`spawn` with no `stdio` option defaults to **pipes**. The only listener attached is -`proc.on('exit')` (`:97`). Nothing ever reads `proc.stdout`/`proc.stderr`, so once the OS pipe -buffer fills (tens of KB, which ComfyUI's model-loading logs and per-step progress exceed easily) -**the child blocks on write mid-run**. This is not a diagnostics gap, it is a deadlock for long -generations. And when the child dies instantly, the poll loop still burns the full 240s (`:104`) -before throwing "ComfyUI did not become ready in time." with no captured output. The project's own -spandrel sidecar shows the right pattern: an 800-byte stderr tail surfaced in the error -(`comfy/sidecar.ts:68-71, 91-92`). - -**Fix**: attach `proc.stdout.resume()` and a stderr-tail collector immediately; include the tail in -the timeout error; bail as soon as `exit` fires instead of polling 240s. Add a "ComfyUI server URL" -setting (default `http://127.0.0.1:8188`) tried first, and bind our own launch to a free ephemeral -port instead of a fixed 8199. - ---- - -### M2. A ComfyUI that is running right now is reported as "not found" - -**`src/main/generate/comfy.ts:73`** ・ severity **medium** - -```ts -export function comfyGenerationAvailable(): boolean { - return findComfyLaunch() != null -} -``` - -Pure filesystem, and this is what `generate:status` returns (`ipc.ts:258`). Meanwhile -`ensureComfyServer` (`:79-82`) happily reuses a live server the status check just declared absent. -A working `listCheckpoints(baseUrl)` that asks the live server exists at `comfy.ts:261` and is -never called. This is exactly the user the H3 banner tells to "open ComfyUI once". - -**Fix**: make `generate:status` async and probe 8188 / FS_PORT / a configurable URL first; if a -server answers, report available and seed the picker from `/object_info`. Fall back to the -filesystem scan only when nothing is listening. - ---- - -### M3. A missing bundled binary surfaces as `spawn gswin64c ENOENT` on the queue card - -**`src/main/toolResolver.ts:81, 99`** → **`run.ts:40`** → **`registry.ts:106-114`** → -**`jobQueue.ts:100`** ・ severity **medium**, conditional on H2 - -`resolveGhostscript()` returns the bare `'gswin64c'` when the bundled tree is absent; same for -Real-ESRGAN (`:99`). `run()` does `child.on('error', reject)` with Node's raw error, -`runToOutput` rethrows unchanged, and `jobQueue.ts:100` emits `(err as Error).message` straight -into the failed row. `describeToolError` (`registry.ts:132`) only parses stderr from a process that -actually started, so it never sees a spawn failure. There is no startup preflight: -`index.ts` `whenReady` (`:189-199`) only sweeps temp dirs, registers the media protocol and creates -the window. `checkTool` **is** exposed (`preload/index.ts:76`, `ipc.ts:99`) and has **zero callers** -in the renderer. - -**Fix**: catch the spawn error in `run.ts` and rethrow a typed `ToolMissingError` carrying the tool -id; map it in `registry.ts` to the same style of message the LibreOffice path already uses. Better, -run a one-shot startup probe that disables affected operations in the UI rather than letting a -200-file queue fail one row at a time. - ---- - -### M4. `resolveUv()` cannot see the uv the app itself downloaded - -**`src/main/toolResolver.ts:159`** ・ severity **medium** ・ breaks for: a fresh user with no uv, and -provably **any user who already completed the PiD install**. - -The doc comment at `:158` says "winget's package dir, the standard user install, **or PATH**". The -body checks three fixed paths and returns null. No PATH probe exists anywhere. The sharper gap: -`pid/install.ts:196-213` `ensureUv()` **already downloads a pinned standalone uv** into -`/uv/uv.exe` when `resolveUv()` returns null, and `resolveUv()` never checks that -location. So a user who sat through a 6 GB PiD install is still told -"Background removal needs uv... `winget install astral-sh.uv`" (`registry.ts:874-877`). The winget -candidate is also hardcoded down to the package family hash -`astral-sh.uv_Microsoft.Winget.Source_8wekyb3d8bbwe`. - -**Fix**: extract `ensureUv` into a shared `src/main/uv.ts`; add `join(pidRoot(), 'uv', 'uv.exe')` as -a candidate; probe the bare name once (`run('uv', ['--version'])`, cached). Then give Remove -Background a "Set up background removal (one-time download)" button using the same progress modal -instead of asking a non-technical user to open a terminal. Enumerate -`%LOCALAPPDATA%/Microsoft/WinGet/Packages/*` for a dir starting `astral-sh.uv_` rather than -hardcoding the hash. - ---- - -### M5. Three of the four recursive model walks have no symlink-cycle guard, and the scan blocks the main process - -**`src/main/generate/models.ts:35`**, **`archRegistry.ts:152-177`**, **`comfy/discover.ts:188-209`** ・ -severity **medium** - -`walkModels`'s inner `walk()` recurses on `st.isDirectory()` with `seen` keyed by the lower-cased -**relative** name, which keeps growing on each loop iteration and therefore never stops the -recursion. Junctioning a shared models folder (routine when two ComfyUI installs share weights) -hangs the app. `scanModelFiles` (`discover.ts:243-247`) has the correct pattern the other three -are missing. All of it runs synchronously inside `ipcMain.handle('generate:status')` with a -`readSafetensorsHeader` per checkpoint over the ~180 candidate bases `comfyModelsBases()` returns. - -**Fix**: add the `visited` / `resolve()` guard to all three, cap depth at ~4, move the scan off the -main thread, and cache keyed on directory mtimes. - ---- - -### M6. No install lock: two concurrent installs destroy each other - -**`src/main/ipc.ts:182, 221`** ・ severity **medium** - -Neither `pid:install` nor `comfy:install` has in-flight dedupe or a module-level lock, and both -write the **same fixed temp paths**: `pid-src.zip` (`install.ts:137`), `_extract` (`:144`, rmSync'd -at `:145` and `:154`), `uv.zip` (`:205`), plus `rmSync(pidRepoDir())` at `:152` and `uv venv` at -`:228`. The only guards are renderer-local React state (`PidUpscale.tsx:15`, `ComfyImport.tsx:66`), -and `PidInstallCard` is conditionally mounted (`OptionsPanel.tsx:477-481`), so navigating away and -back during a multi-GB install resets the flag and re-enables the button. - -**Fix**: module-level `let inFlight: Promise | null` in `install.ts` shared by both entry -points (they share every phase anyway); `mkdtempSync` per run instead of fixed temp names. - ---- - -### M7. No disk-space preflight, no resumable downloads, no repair path - -**`src/main/pid/install.ts:295`** ・ severity **medium** - -`installPid` goes straight from `mkdirSync(pidRoot())` into the phases with no space check -(`grep freeSpace|statfs` returns nothing). A full disk surfaces as whatever the write stream throws. -Neither downloader sends a `Range` header or reuses an existing part file: both open with -`rmSync(part, { force: true })`, so a 2.6 GB checkpoint that drops at 95% restarts from zero, every -time. `PidUpscale.tsx:39` honestly advertises "~6 GB" but nothing checks whether it fits. - -Worse, there is **no repair path**: grep for `repair|reinstall|uninstall|rmSync(pidRoot` across -`src/` finds no reset action anywhere. `pidInstalled()` returns true on mere `existsSync` -(`paths.ts:94-104`), so a poisoned install (a captive-portal block page whose Content-Length -matches its body, passing the `got < total` check at `install.ts:111`) is permanently -unrecoverable from the UI. - -**Fix**: sum the requirement (env ~3 GB + `bb.approxBytes`, already populated at `paths.ts:89` and -**never read anywhere**) against `fs.statfs` on the userData volume and refuse with "PiD needs about -10 GB free on C:, you have 4 GB". Keep the `.part`, `stat` it, send `Range: bytes=-`. Add a -visible "Repair / remove AI install" button that does `rmSync(pidRoot(), {recursive: true, force: true})`. - ---- - -### M8. `pid/install.ts` forks a weaker downloader than the one in the same repo - -**`src/main/pid/install.ts:83`** ・ severity **medium** - -`install.ts:70-120` is a private copy of `net/download.ts` missing all three of that file's guards: -no 401/403 license message, no HTML/JSON-as-200 rejection, no `minBytes` floor. It is what fetches -the 2.6 GB checkpoint (`:287`) and 320 MB VAE (`:278`). Meanwhile `PidBackbone.approxBytes` exists -and is populated and is never read by anything. - -**Fix**: delete the private `download()` and call `downloadFile` from `net/download.ts` with -`minBytes = Math.floor(bb.approxBytes * 0.9)`. Strictly less code. - ---- - -### M9. Downloads use Node's undici `fetch`, not Electron's `net.fetch` - -**`src/main/net/download.ts:33`**, **`pid/install.ts:83`** ・ severity **medium** - -Both are the Node global: no system-proxy support, and TLS validated against Node's bundled CA list -rather than the Windows certificate store. `grep -i 'net\.fetch|proxy|setProxy|HTTPS_PROXY' -src/main` returns zero hits. On a corporate machine behind a TLS-inspecting gateway the install can -never succeed. And the error reaches the user verbatim: undici's rejection message is literally -`fetch failed`, with the real code hidden in `.cause`, so **every user whose wifi is off sees only -"fetch failed"**. Note the inconsistency this creates: the `uv pip install` phases -(`install.ts:233-253`) run in a subprocess that **does** honour proxy env vars, so the pip half can -work while our own fetch fails. - -**Fix**: `import { net } from 'electron'` and use `net.fetch` in both downloaders (Electron -documents it for exactly this). Map `err.cause.code`: `ENOTFOUND`/`ECONNREFUSED` to "Could not -reach , check your internet connection or proxy"; -`UNABLE_TO_VERIFY_LEAF_SIGNATURE`/`SELF_SIGNED_CERT_IN_CHAIN` to "Your network inspects HTTPS -traffic, ask IT to allow huggingface.co and github.com". - ---- - -### M10. No integrity verification on anything downloaded, including code that gets executed - -**`src/main/net/download.ts:15`**, **`pid/install.ts:70`** ・ severity **medium/high** - -`grep -riE "sha256|checksum|createHash|integrity|signature" src/` returns exactly one hit, an -unrelated comment. The artifacts so fetched are **executed**: `uv.exe` (downloaded `:206`, -extracted `:209`, spawned at `:228/233/250/313`), and the PiD source zip (`:138`) which is installed -with `uv pip install -e .` (`:250`), running upstream's build backend, then put on `PYTHONPATH` for -the sidecar (`pid/sidecar.ts:94`). - -Two honest caveats that keep this at medium rather than critical. All transfers are HTTPS to -`github.com` / `huggingface.co` / `download.pytorch.org`, so plain in-transit tampering already -needs a trusted-CA MITM. And a substituted PiD `.pth` weight is **not** code execution: the -repo's loader (`pid/_ext/imaginaire/utils/checkpointer.py:229`) calls plain `torch.load`, and the -pinned `torch==2.10.0` defaults `weights_only=True`. The real exposure is the unpinned repo zip -(§4) and the general absence of defence in depth. - -**Fix**: ship an `artifacts.json` of `{url, bytes, sha256}`; tee the existing pipeline through -`crypto.createHash('sha256')` and refuse the rename on mismatch. **This is also the mechanism that -makes a data-driven model list safe**, so it is a prerequisite for §5, not an optional extra. - ---- - -### M11. The GPU gate is "nvidia-smi answered", with no compute-capability or driver floor - -**`src/main/pid/gpu.ts:41`** ・ severity **medium** - -`detectNvidia` queries only `name,memory.total`; `hasNvidia()` is `detectNvidia() != null`; that is -the **only** gate on offering the AI-models tier (`OptionsPanel.tsx:393, 405`), whose -`ComfyImportCard` install button triggers a ~3 GB `torch==2.10.0 --index-url .../cu128` install -(`install.ts:236-244`) with no fallback index and no driver check. A GTX 10xx (Pascal) owner waits -through the whole download and then hits a CUDA kernel-image error. VRAM is advisory and after the -fact (`OptionsPanel.tsx:419`, note only). - -Correction to a common framing: PiD itself is only offered to users who already have PiD weights in -ComfyUI (`OptionsPanel.tsx:409`), so the unguarded entry point is the **ComfyUI engine setup**, not -PiD. - -**Fix**: extend the query to `name,memory.total,compute_cap,driver_version` (`parseNvidiaSmi` is -pure and already unit-tested in `test/pid.test.ts`), gate the tier on `compute_cap >= 7.5` plus a -driver floor, and say "PiD needs an RTX-class NVIDIA GPU (your is not supported)" **before** -any download. Move the torch spec and index URL into the manifest so a cu126/cu130 variant can be -chosen per machine. - ---- - -### M12. Zero test coverage for dependency and model resolution - -**`test/`** ・ severity **medium** - -Grepping all 15 test files for `resolveUv`, `resolveTool`, `resolveSoffice`, `resolveGhostscript`, -`resolveRembg`, `removebgStatus`, `findComfyLaunch`, `comfyCodeRoots`, `guessComfyFolder`, -`comfyModelsBases`, `scanGenerationModels`, `resolveArch` and `toolAvailable` returns **zero -matches**. The only discovery test is pure path math on a temp fixture (`comfy.test.ts:7`). The -suite passes on any machine precisely because it never exercises the machine-dependent code, which -is the exact code that differs between your machine and everyone else's. - -**Fix**: these functions are nearly pure over env vars plus fs. Add fixture-tree tests stubbing -`HOME`/`APPDATA`/`LOCALAPPDATA` into a temp dir: a ComfyUI at an arbitrary path is found via the -remembered store; `resolveArch()` reports missing companions against a fake models tree; -`resolveUv()` finds a uv on PATH; `resolveSoffice`/`resolveGhostscript` honour `ProgramFiles`. - ---- - -### Low-severity, worth a cleanup PR - -- **`toolResolver.ts:181`** `toolAvailable()` probes with `-version`, which two of the four bundled - tools reject. Verified against the repo's own binaries: `magick -version` → 0, - `ffmpeg -version` → 0, **`mutool -version` → exit 1** (prints usage), **`caesiumclt -version` → - exit 2** ("unexpected argument '-v'"). Correct probes: `mutool -v`, `caesiumclt --version`. Dead - code today (zero renderer callers), but it is the foundation of the M3 preflight. -- **`toolResolver.ts:43-48, 70`** and **`fetch-binaries.mjs:157-159, 196, 216-219`** hardcode - `C:\Program Files`. Build from `process.env.ProgramFiles` / `ProgramFiles(x86)` / `ProgramW6432`, - keeping the literals as fallback. (Note: Windows localizes only the _display_ name; the on-disk - path is always `\Program Files`. The real case is a non-C: system drive.) `pid/install.ts:58` - already does this correctly with `process.env.SystemRoot`. -- **`generate/comfy.ts:54`** writes `base_path: ${d}` as a bare YAML scalar. A space followed by - `#` starts a YAML comment, so `D:\AI #2\ComfyUI` silently truncates and ComfyUI then sees none of - the user's models, with preflight blaming an already-running ComfyUI. Emit a double-quoted - scalar. (A `:` in the path is impossible on Windows; encoding is already fine via `PYTHONUTF8=1`.) -- **`index.ts:151`** main window's `setWindowOpenHandler` passes `details.url` to - `shell.openExternal` with no scheme allowlist. Not reachable today (CSP is `script-src 'self'` and - the main window renders no untrusted markup), but `previewWindow.ts:54-57` already does it right - in one line. Copy that. -- **`fetch-binaries.mjs:94`** uses the **rolling** `ffmpeg-release-essentials.zip`, whose contents - change with every release, and no download in the file computes a hash. Ghostscript (`:227`) and - Real-ESRGAN (`:290`) _are_ pinned, so ffmpeg is the only floating URL. `bundleImageMagick`, - `bundleCaesium`, `bundleMutool` and `bundleLibreOffice` all source from a **local install found - via `which()`**, so the shipped bytes depend on your winget state and a bare CI runner cannot - reproduce the build. -- **`comfy/discover.ts:11`** `MODEL_EXTS` includes `.pt`. Reading the installed spandrel loader: - `.pth`/`.ckpt` go through `pickle_module=RestrictedUnpickle` (safe) and `.safetensors` through - `load_file` (safe), but **`.pt` goes to `torch.jit.load` with no restriction**. A bulk scan loads - every `.pt` in the folder, including ones the user never selected. Drop `.pt` from the bulk scan - and make it an opt-in per-file confirmation. -- **`pythonEnv.ts:43`** auto-discovers and later spawns `python.exe` under `C:\`, `D:\`, `E:\`, - `Downloads` and `Desktop`. `icacls C:\` on this machine returns - `NT AUTHORITY\Authenticated Users:(AD)`, so a non-elevated process can create `C:\ComfyUI\`. - Execution requires the user to trigger Scan/upscale/Generate (status checks spawn nothing), and - an attacker who can write to disk usually already has execution, so this is defence in depth. But - once the folder picker from H3 exists, **drop the drive roots, Downloads and Desktop from implicit - discovery** and confirm the first spawn of any newly-discovered interpreter, remembered per path. - ---- - -## 4. Model staleness: the real problem - -This is your central worry, and it is correctly placed. Here is the **actual path a user must -follow today** to add a new model, per type. I walked each one in the code. - -### 4a. A new ComfyUI checkpoint of a known family (a new Flux 1 finetune, a new SDXL merge) - -1. Drop the file in `ComfyUI/models/checkpoints/` or `diffusion_models/`. -2. Reopen the Generate panel. -3. It works. - -**This case is already solved and you should be proud of it.** `readSafetensorsHeader` + -`classifyArch` (`archScan.ts:21, 76-105`) identify it by tensor keys, `resolveArch` finds the -companions, and the rename-safe byte-size check picks the right Flux 2 encoder. Zero code change. - -### 4b. A new checkpoint **family** (SD3.5, Qwen-Image, Chroma, HiDream, whatever ships next month) - -1. Drop the file in `diffusion_models/`. -2. `classifyArch` returns `'unknown'` (or `'sd3'`). -3. `models.ts:111-114`: `if (!SUPPORTED.includes(arch)) { unrecognized += 1; continue }`. - **The file is never pushed into the list.** It is invisible except as a counter. -4. There is no override, no "try anyway", no workflow import. `generateImages` throws on - `!gm.runnable` before ever contacting ComfyUI (`generate/index.ts:55-60`). -5. The user's only recourse is to wait for you to ship a new Filesmith build. - -Adding that family requires editing **six places**, none of which is data: - -- `src/shared/genArch.ts:14` the `GenArch` union -- `src/shared/genArch.ts:32` `ARCH_INFO` (sampler, scheduler, steps, cfg, guidance) -- `src/shared/genArch.ts:152/188/222/255` a hand-written API-format graph, plus the - `buildDiffusionWorkflow` switch at `:326-337` whose `default:` **throws** -- `src/main/generate/archRegistry.ts:81-145` `requiredCompanions` with pinned filenames and URLs -- `src/main/generate/models.ts:16` `SUPPORTED` -- `src/main/generate/preflight.ts:42-47` `CLIP_REQ` (loader + `type` enum literal) and `:50-56` - `EXTRA_NODES` - -Node class names, sampler names and magic constants are baked into the graphs -(`ModelSamplingAuraFlow` with `shift: 3` at `genArch.ts:227`). **Nothing reads a workflow from -disk**: grep shows no JSON or YAML workflow source anywhere in `src/`. And if ComfyUI renames a node -or a CLIPLoader `type` enum value, `preflight.ts:104` raises `missingNodeError`, which returns -`ARCH_INFO[arch].minComfyNote`, i.e. **a fresh fully-updated ComfyUI is told to "update ComfyUI"**. - -Also, the eight companion URLs are all `resolve/main` (a moving branch), e.g. -`archRegistry.ts:47`, `:61`, `:96`, `:124`. The day Comfy-Org reorganizes a repo or moves a file out -of `split_files/`, `download.ts:39` throws `Download failed (404)`, the CompanionDownload card shows -it with only a retry button, and the model stays non-runnable forever. There is no mirror list, no -user-supplied URL, and no "I already have this file, point at it" picker anywhere in the flow. - -### 4c. A new upscaler architecture (DAT, SPAN, ATD, RealPLKSR, SeedVR, the 2026 arch) - -**Via ComfyUI import**: 1. Drop the file in `models/upscale_models/`. 2. Click Rescan. 3. spandrel -probes it and it works, badged "experimental". **This path is genuinely arch-agnostic and needs no -code change.** Excellent. - -**But** it is gated three ways: it needs an NVIDIA GPU (`OptionsPanel.tsx:405`), a ComfyUI install, -and either the user's own torch+spandrel Python or a 3 GB engine download. And `install.ts:305-319` -freezes spandrel forever: `if (existsSync(spandrelMarker())) return`, installing `spandrel>=0.4.1` -resolved **on whatever day the user set up**, with the marker recording no version. A user on -Filesmith's own venv who later downloads a model with a newer architecture gets -`{ ok: false, reason: 'could not be read' }` (`discover.ts:313`) and **there is no UI to update the -loader**: `ComfyImport.tsx:81` shows the setup button only when `!engineReady`, and the ready branch -offers only Change folder / Rescan. (Users on their own ComfyUI Python escape this, since -`pythonEnv.ts:98-99` prefers it and they keep ComfyUI updated.) - -**Via the bundled Real-ESRGAN (the only cross-vendor path, and the only one an AMD/Intel user has)**: -There is no path. `fetch-binaries.mjs:255` fixes at **build time** which two model files ship; -`upscale.ts:13` repeats the same two names; `shared/compress.ts:70-73` `UPSCALE_MODELS` is a closed -union of `'photo' | 'anime'`. I grepped every `readdirSync` in `src/main` (`index.ts:19`, -`toolResolver.ts:72`, `registry.ts:374`, `comfy/discover.ts`, `generate/models.ts`) and **nothing -ever reads `resources/realesrgan/models`**, even though `registry.ts:828-832` passes it as `-m`. -The ncnn binary would happily run any `.param`/`.bin` pair dropped in there, on any Vulkan GPU -including AMD. Nothing looks. - -### 4d. A new rembg model (a new BiRefNet generation, BEN2, RMBG-3) - -1. There is no UI. Grepping the entire renderer for `bgModel` returns **zero hits**. -2. `shared/removebg.ts:22` is a four-value compile-time union; `tools/removebg.ts:18-21` clamps - anything else back to the default. -3. `toolResolver.ts:120` pins `rembg[cli,cpu]==2.0.75`, freezing the session catalogue at that - release. - -Two mitigations worth stating fairly. The pin is **not** permanent: `resolveRembg()` prefers an -already-installed uv tool at `%APPDATA%/uv/tools/rembg` with no version constraint -(`toolResolver.ts:149-150`), so a user who runs `uv tool install rembg` gets the newer binary. And -the allowlist is a **deliberate, documented licensing boundary** (`shared/removebg.ts:1-12` cites -bria-rmbg CC BY-NC, u2net_human_seg's Supervisely provenance, isnet-anime's scraped provenance), -not an oversight. It must stay a vetted list. What genuinely rots is that the vetted list lives in -compiled code with no data-driven override. - -### 4e. A new PiD backbone - -1. There is no UI and no path. `paths.ts:84-91` has exactly one entry, commented "Only flux is wired - for now". -2. The identity is hardcoded across four files, **including the IPC boundary**: `ipc.ts:180` - `pidInstalled('flux')`, `:184` `installPid('flux', ...)`, `:212` `PID_BACKBONES.flux.checkpointDir`. -3. The weight filename `model_ema_bf16.pth` appears literally at `paths.ts:101`, `install.ts:281`, - `install.ts:287` and `comfy/discover.ts:231`. -4. `install.ts:31` `HF_BASE = 'https://huggingface.co/nvidia/PiD/resolve/main'`, a branch, not a - revision. An upstream rename 404s every install. -5. `install.ts:30` fetches `.../PiD/archive/refs/heads/main.zip`, **the head of a moving branch**, - with a hard `PiD-main` folder assumption (`:150-151`) and a `pyproject` regex rewrite (`:162-168`). - `REPO_MARKER` (`:135, :170`) is an **empty file recording no version**, so a vendored copy is - never refreshed. Two users installing a month apart run different code with no way to tell which, - and neither can ever receive a fix. -6. `resources/pid/pid_server.py:42-44` imports `pid._src.inference.cli_utils/decoder/inference_utils`, - the **underscore-private** modules of that moving branch, and `:87` reads - `model.config.input_caption_key`. The day nv-tlabs refactors `_src`, every new install breaks. - -### Where the path rots: the summary table - -| Bound thing | File:line | Rots when | -| ---------------------------------------- | ---------------------------------------------- | -------------------------------------- | -| `GenArch` union | `shared/genArch.ts:14` | any new checkpoint family ships | -| `SUPPORTED` allowlist | `generate/models.ts:16` | same; file becomes invisible | -| Workflow graphs + builder switch | `shared/genArch.ts:152-337` | ComfyUI renames a node | -| `CLIP_REQ` / `EXTRA_NODES` | `generate/preflight.ts:42-56` | ComfyUI renames a loader `type` enum | -| 8 companion URLs on `resolve/main` | `generate/archRegistry.ts:36-136` | HF repo reorg or rename | -| Companion filename regexes | `generate/archRegistry.ts:33-133` | a user's file is named differently | -| ncnn model names (build + runtime) | `fetch-binaries.mjs:255`, `upscale.ts:13` | any new ncnn upscaler | -| `VERIFIED_TOKENS` badge list | `shared/comfy.ts:32` | any upscaler released after this build | -| rembg sessions + version pin | `shared/removebg.ts:22`, `toolResolver.ts:120` | any new matting model | -| PiD backbone table + IPC literals | `pid/paths.ts:84`, `ipc.ts:180-212` | any new NVIDIA checkpoint | -| PiD repo `heads/main.zip` + empty marker | `pid/install.ts:30, 135, 170` | upstream touches `_src` | -| spandrel frozen by version-less marker | `pid/install.ts:305-319` | any new upscaler arch | -| Dimension clamp 2048, SDXL bucket list | `shared/generate.ts:89-103` | a model with a higher native res | -| torch pin + cu128 index | `pid/install.ts:236-244` | a non-12.8 CUDA generation | - -Thirteen of those fourteen rows are fixed by one mechanism. Build it once. - ---- - -## 5. Proposed design: a user-extensible model layer - -**The decision: model identity becomes data, on disk, in three merged layers, and the app stops -hardcoding names. Unknown models are always shown and always attemptable. Every downloadable -artifact carries a sha256. This is one subsystem, not a rewrite.** - -### 5.1 Where it lives and how it merges - -Three layers, merged by `id`, later layers winning field-by-field: - -``` -1. BUILT-IN /resources/registry/*.json read-only, ships in the installer -2. CHANNEL %APPDATA%/Filesmith/registry/channel/ OTA-refreshed cache, signed -3. USER %APPDATA%/Filesmith/registry/user/ the user's own entries, never touched -``` - -Rules, non-negotiable: - -- **An app update replaces layer 1 only.** It can never read, write or delete layer 3. This is the - whole point. -- **A channel refresh replaces layer 2 wholesale**, only after signature verification. If the - signature fails or the network is down, layer 2 is kept as-is and the app runs on 1+3. Offline is - a first-class state, not an error. -- **Merge is per-`id`, per-field.** A user entry with `{"id": "flux2", "companions": [...]}` - overrides only the companions of the built-in `flux2` and inherits its workflow. This is how a - user fixes a dead HF URL in 30 seconds without understanding the rest. -- Each file is `{ "schemaVersion": 1, "entries": [...] }`. On load, entries whose - `schemaVersion` exceeds the app's are **skipped with a visible note**, never crash the load. - A malformed file disables _that file_ and surfaces a warning, never bricks the registry. -- `readComfyStore` / `writeComfyStore` (`comfy/store.ts`) is already exactly this pattern at 45 - lines. Generalize it; do not invent something new. - -### 5.2 Capability descriptors, not name allowlists - -The core inversion. Today the app asks "is this model's name in my list?". It should ask -"**what can this file do, and do I have a runner that can do that?**". - -An entry declares **capabilities** and **requirements**: - -- `detect`: how to recognize this family from the file itself (tensor-key substrings, metadata - regex, byte-size ranges). Never a filename. -- `capabilities`: `{ task: 'text-to-image', minDim, maxDim, dimStep, sizeBuckets }` for generation; - `{ task: 'upscale', scales: [2,3,4], inputFormats: [...] }` for upscalers. This kills the global - 2048 clamp (`shared/generate.ts:100`) and the SDXL-only bucket list. -- `requires`: `{ nodes: [...], clipLoader: {node, type}, gpu: {vendor, minComputeCap, minVramMb} }`. - Preflight already validates all of this against `/object_info` (`preflight.ts:77-131`); it just - reads the list from data instead of `CLIP_REQ`/`EXTRA_NODES`. -- `workflow`: an API-format graph with `${...}` placeholders. This is what makes a new family a - file drop instead of a release. -- `companions`: role, subdir, an **identify-by-content** signature, and a download descriptor with - **mirrors** and a **mandatory sha256**. - -### 5.3 Probe first, name never, user overrides anything - -Priority order for identifying any model file: - -1. **Content probe.** `readSafetensorsHeader` (`archScan.ts:21`) for generation models, spandrel - `probeModels` (`discover.ts:275`) for upscalers, an ncnn `.param` header read for Real-ESRGAN - models. Both primitives already exist and are already tested. -2. **Declared metadata** (`modelspec.architecture`), already preferred at `archScan.ts:72`. -3. **Byte-size discrimination**, already used correctly for Flux 2's encoder (`archRegistry.ts:115`). -4. **Filename hint**, last and advisory only. Today it is load-bearing for companions - (`archRegistry.ts:33-133`), which is why a user with `flux1-ae.safetensors` or - `t5-xxl_fp16.safetensors` re-downloads gigabytes they already have. -5. **User override**, which beats all of the above. Any inferred field (arch, scale, companion path, - sampler defaults) is editable in the UI and persisted as a user-layer entry keyed on the file's - sha256-of-first-1MB plus size, so a rename does not lose it. - -### 5.4 The unknown-model fallback (mandatory) - -**No model file is ever invisible.** Delete `models.ts:111-114`'s `continue`. Replace with: - -- Unknown generation model: listed, badged `unknown architecture`, with a **"Try anyway"** action - that runs the generic `CheckpointLoaderSimple` graph (or a user-selected workflow template) and - surfaces ComfyUI's own error verbatim. The user learns something either way. -- Unknown upscaler: already correct, keep it (`experimental` badge, fully usable). -- GGUF and non-image exclusions: **render the counts**. `models.ts:102-110` computes `gguf` and - `excluded` and both fields reach the renderer, but a grep of `src/renderer` for either returns - nothing, so a GGUF-only user is told "No image models found" while `diffusion_models` is full. - Three lines beside the existing `unrecognized` line at `OptionsPanel.tsx:991`. -- Non-image exclusion becomes **advisory**, not terminal: `archScan.ts:119` keys on - `patch_embedding` + `time_embedding`, which are generic DiT names. List it as "looks like a - video/3D model, not recommended" and let the user pick it anyway. - -The rule: **the app's job is to make the good path obvious, not to make the unusual path -impossible.** - -### 5.5 The "add a model" UX - -One entry point, reachable from the Generate panel, the Upscale panel and Settings: - -**Add a model** → - -- **Point at a file or folder.** App probes it, shows what it inferred (architecture, scale, - detected companions, missing companions), lets the user correct any field, then registers a user - entry. This is the 90% case and needs no network. -- **Paste a URL.** App fetches it (through `net.fetch`, with the `.part`/rename/minBytes discipline - already in `download.ts`), computes the sha256 **while streaming**, shows the hash and the host, - and asks for confirmation before registering. The recorded hash becomes the entry's integrity - anchor for every future re-download. -- **Paste a ComfyUI workflow (API format).** The single highest-leverage addition. ComfyUI's own - "Save (API format)" export, schema-validated, placeholders detected, registered as a workflow for - a new or existing arch. A user who can already generate a model in ComfyUI can now generate it in - Filesmith. No app update, no understanding of Filesmith internals. - -### 5.6 Security for user-added models - -This is where a data-driven registry earns its keep or becomes a liability. Non-negotiables: - -- **Never execute anything that came from a model or a ComfyUI response.** Today this is already - true and must stay true: generated images are pulled as **bytes** over `/view` with URL-encoded - params (`generate/comfy.ts:249-258`) and written through `reserveOutPath`. No path from ComfyUI - is ever used to read or write a file directly. Keep that invariant explicit in the manifest - loader's doc comment so nobody regresses it. -- **A workflow template is data, never code.** JSON only, `JSON.parse`, no `eval`, no function - strings, no `require`. Validate it is an object of `{class_type, inputs}` nodes and that every - `${placeholder}` is in the known set. Only ever POST it to a loopback address. -- **Path constraints on every registry-supplied path.** `subdir` must be in a fixed enum - (`text_encoders`, `clip`, `vae`, `checkpoints`, `diffusion_models`, `unet`, `upscale_models`). - `filename` must match `/^[A-Za-z0-9._-]+$/` with **no separators and no `..`**. This is not a - live defect today (both are compile-time constants), but the moment the manifest is user- or - network-editable, `join(root, f.subdir, f.filename)` (`companions.ts:53`) becomes a traversal - sink. Enforce it in the loader, once, before any entry is trusted. -- **`sha256` mandatory on every `download` descriptor**, verified while streaming, `.part` discarded - on mismatch. Absent hash means the entry is loadable but its downloads are **blocked with an - explicit "this entry has no integrity hash" warning**, not silently allowed. -- **Host allowlist plus `https:` only** for layer-1 and layer-2 URLs. A layer-3 (user) URL outside - the allowlist is permitted but shows an unmissable "you added this source" provenance banner and - requires an explicit confirm. The user is allowed to take risks with their own machine; they are - not allowed to be surprised. -- **Channel signing.** Layer 2 is verified with an Ed25519 signature over the manifest bytes using a - public key compiled into the app. No signature, no trust, keep the previous cache. A ~40-line - addition using Node's built-in `crypto.verify`, no dependency. -- **Safe extraction.** Keep `System32\tar.exe` by full path (`install.ts:50-59`), which is - deliberate and correct: long-path support and immunity to a GNU tar earlier on PATH. Add an - explicit reject of entries with `..` or absolute paths rather than relying on bsdtar's default. -- **Provenance shown in the UI, always.** Every model row displays its layer (Built-in / Channel / - Added by you), its source host, and whether its hash is verified. A user should never have to - wonder where a model came from. This is also what makes the "experimental" badge meaningful - instead of decorative. -- **Formats stay tiered.** `.safetensors` is the default and the only one auto-loaded in bulk; - `.pt` (which reaches unrestricted `torch.jit.load`) is excluded from bulk scans and requires a - per-file confirmation. Assert the probing env's spandrel version before probing anything but - `.safetensors`. - -### 5.7 How built-in defaults update independently of the app binary - -- Layer 1 ships in the installer, so a fully offline fresh install has a complete working catalog. - **Offline is never degraded relative to today.** -- Layer 2 refreshes from a URL you control (a GitHub Pages JSON is enough), checked at most once a - day, in the background, non-blocking, failing silently into "keep what we have". Signature - verified before it replaces the cache. -- **This is your remote lever.** The day Comfy-Org moves `t5xxl_fp8_e4m3fn_scaled.safetensors`, you - push a one-line channel update and every existing install is fixed within a day. No release, no - signing, no download prompt. That single capability is worth the whole subsystem. -- Layer 3 never expires and is never overwritten. A user's hand-added model survives every app - update and every channel refresh, forever. - -### 5.8 Concrete example: one registry entry - -`%APPDATA%/Filesmith/registry/user/z-image.json` (identical shape to the shipped -`resources/registry/gen-archs.json`): - -```json -{ - "schemaVersion": 1, - "entries": [ - { - "id": "z-image", - "kind": "generate", - "label": "Z-Image Turbo", - "group": "Z-Image", - "provenance": { "source": "builtin", "addedAt": "2026-01-14T00:00:00Z" }, - - "detect": { - "metaArch": ["z-image", "zimage"], - "tensorKeys": { "all": ["cap_embedder", "noise_refiner"], "none": ["double_blocks"] }, - "sizeBytesRange": [4000000000, 14000000000] - }, - - "capabilities": { - "task": "text-to-image", - "minDim": 256, - "maxDim": 2048, - "dimStep": 64, - "sizeBuckets": [ - [1024, 1024], - [1152, 896], - [896, 1152], - [1216, 832], - [832, 1216] - ] - }, - - "sampler": { - "name": "res_multistep", - "scheduler": "simple", - "steps": 8, - "cfg": 1, - "guidance": 0, - "hasGuidance": false - }, - - "requires": { - "nodes": [ - "UNETLoader", - "CLIPLoader", - "VAELoader", - "CLIPTextEncode", - "ModelSamplingAuraFlow", - "ConditioningZeroOut", - "EmptySD3LatentImage", - "KSampler", - "VAEDecode", - "SaveImage" - ], - "clipLoader": { "node": "CLIPLoader", "type": "lumina2" }, - "minComfyNote": "Z-Image needs ComfyUI v0.6.0+ (late November 2025)." - }, - - "companions": [ - { - "role": "clip", - "label": "Qwen3-4B text encoder", - "subdir": "text_encoders", - "identify": { - "tensorKeys": { "any": ["model.layers.0.self_attn.q_proj.weight"] }, - "sizeBytesRange": [7000000000, 9000000000], - "nameHint": "qwen.?3.?4b" - }, - "download": { - "filename": "qwen_3_4b.safetensors", - "bytes": 8054337536, - "sha256": "0000000000000000000000000000000000000000000000000000000000000000", - "urls": [ - "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0/split_files/text_encoders/qwen_3_4b.safetensors", - "https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files/text_encoders/qwen_3_4b.safetensors" - ] - } - }, - { "role": "vae", "ref": "flux-ae" } - ], - - "workflow": { - "format": "comfy-api-v1", - "template": { - "1": { - "class_type": "UNETLoader", - "inputs": { "unet_name": "${unet}", "weight_dtype": "default" } - }, - "2": { - "class_type": "CLIPLoader", - "inputs": { "clip_name": "${clip}", "type": "lumina2", "device": "default" } - }, - "3": { "class_type": "VAELoader", "inputs": { "vae_name": "${vae}" } }, - "4": { - "class_type": "ModelSamplingAuraFlow", - "inputs": { "model": ["1", 0], "shift": 3 } - }, - "5": { - "class_type": "CLIPTextEncode", - "inputs": { "clip": ["2", 0], "text": "${prompt}" } - }, - "6": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["5", 0] } }, - "7": { - "class_type": "EmptySD3LatentImage", - "inputs": { "width": "${width}", "height": "${height}", "batch_size": 1 } - }, - "8": { - "class_type": "KSampler", - "inputs": { - "model": ["4", 0], - "positive": ["5", 0], - "negative": ["6", 0], - "latent_image": ["7", 0], - "seed": "${seed}", - "steps": "${steps}", - "cfg": "${cfg}", - "sampler_name": "${sampler}", - "scheduler": "${scheduler}", - "denoise": 1 - } - }, - "9": { "class_type": "VAEDecode", "inputs": { "samples": ["8", 0], "vae": ["3", 0] } }, - "10": { - "class_type": "SaveImage", - "inputs": { "images": ["9", 0], "filename_prefix": "${prefix}" } - } - } - } - } - ] -} -``` - -An upscaler entry is much smaller, and shows the same schema covering the ncnn case that has no -extensibility at all today: - -```json -{ - "id": "realesrgan-animevideov3", - "kind": "upscale", - "runner": "realesrgan-ncnn", - "label": "Real-ESRGAN anime video v3", - "provenance": { "source": "user", "addedAt": "2026-07-31T09:12:00Z" }, - "detect": { "ncnnParamBasename": "realesrgan-animevideov3" }, - "capabilities": { - "task": "upscale", - "scales": [2, 3, 4], - "inputFormats": [".png", ".jpg", ".webp"] - }, - "files": [ - { "path": "realesrgan-animevideov3.param", "sha256": "..." }, - { "path": "realesrgan-animevideov3.bin", "sha256": "..." } - ] -} -``` - -### 5.9 The TypeScript it deserializes into - -`src/shared/registry.ts` (new, shared by main and renderer, no Electron import): - -```ts -export type RegistryKind = 'generate' | 'upscale' | 'removebg' | 'pid-backbone' -export type ProvenanceSource = 'builtin' | 'channel' | 'user' - -export interface Provenance { - source: ProvenanceSource - addedAt?: string - /** Host the artifact came from, shown in the UI. */ - host?: string - /** True once every downloadable file has a verified sha256. */ - verified?: boolean -} - -/** How to recognize a model FROM THE FILE. Never a filename alone. */ -export interface DetectSpec { - /** Substrings matched against modelspec.architecture / architecture. */ - metaArch?: string[] - /** Tensor-key substring signature: all of `all`, at least one of `any`, none of `none`. */ - tensorKeys?: { all?: string[]; any?: string[]; none?: string[] } - /** Inclusive [min, max] byte range, for size-discriminated variants. */ - sizeBytesRange?: [number, number] - /** ncnn `.param` basename, for the Real-ESRGAN runner. */ - ncnnParamBasename?: string - /** Advisory only. Never sufficient on its own. */ - nameHint?: string -} - -export interface Capabilities { - task: 'text-to-image' | 'upscale' | 'remove-background' - /** Generation */ - minDim?: number - maxDim?: number - dimStep?: number - sizeBuckets?: [number, number][] - /** Upscale */ - scales?: number[] - inputFormats?: string[] -} - -export interface SamplerSpec { - name: string - scheduler: string - steps: number - cfg: number - guidance: number - hasGuidance: boolean -} - -export interface Requirements { - /** Node class names that must exist in this ComfyUI. Checked via /object_info. */ - nodes?: string[] - /** Loader node + the `type` enum value it must accept. */ - clipLoader?: { node: string; type: string } - gpu?: { vendor?: 'nvidia' | 'amd' | 'intel' | 'any'; minComputeCap?: number; minVramMb?: number } - /** Shown if a node/type check fails. */ - minComfyNote?: string -} - -export interface DownloadSpec { - filename: string - bytes: number - /** MANDATORY for builtin/channel. Absent on a user entry blocks the download. */ - sha256?: string - /** Tried in order. Pin a commit sha first, a moving branch last. */ - urls: string[] -} - -export type CompanionSubdir = - 'text_encoders' | 'clip' | 'vae' | 'checkpoints' | 'diffusion_models' | 'unet' | 'upscale_models' - -export interface CompanionSpec { - role: 'clip' | 'clip2' | 'vae' - label: string - subdir: CompanionSubdir - /** Content-first identification of a file the user may already own. */ - identify: DetectSpec - download: DownloadSpec -} - -/** A companion declared once and referenced by id (e.g. the shared Flux AE). */ -export interface CompanionRef { - role: CompanionSpec['role'] - ref: string -} - -export interface WorkflowSpec { - format: 'comfy-api-v1' - /** JSON DATA. Parsed, validated, never evaluated. Only POSTed to loopback. */ - template: Record }> -} - -export interface RegistryEntry { - id: string - kind: RegistryKind - label: string - group?: string - provenance: Provenance - detect: DetectSpec - capabilities: Capabilities - sampler?: SamplerSpec - requires?: Requirements - companions?: (CompanionSpec | CompanionRef)[] - workflow?: WorkflowSpec - /** Non-downloaded files that must exist beside the runner (ncnn .param/.bin). */ - files?: { path: string; sha256?: string }[] - /** Runner id: 'comfy' | 'realesrgan-ncnn' | 'spandrel' | 'rembg' | 'pid'. */ - runner?: string - /** Engine spec for a runner that installs a Python package (rembg, spandrel). */ - engineSpec?: string - schemaVersion?: number -} - -export interface RegistryFile { - schemaVersion: number - entries: RegistryEntry[] -} - -/** Merge builtin < channel < user, per id, per field. Pure, unit-testable. */ -export function mergeRegistry(layers: RegistryFile[]): RegistryEntry[] { - /* ... */ -} - -/** Score a probed file against an entry's DetectSpec. 0 = no match. Pure. */ -export function scoreDetect(d: DetectSpec, probe: ProbedFile): number { - /* ... */ -} -``` - -Note that `ARCH_INFO` (`shared/genArch.ts:32`) is already a per-arch data table that the UI reads -from (`OptionsPanel.tsx:999` hides the negative prompt when `info.cfg === 1`), and -`classifyModel` (`shared/comfy.ts:57`) **already accepts a `tokens` parameter**. The indirection you -need mostly exists. This is a change of _source_, not of _shape_. - ---- - -## 6. Recommended plan - -Eight phases, each one PR, ordered by (fresh-user impact) x (model-longevity payoff). Phases 1 to 3 -are days of work and remove most of the "only works on the developer's machine" risk. Phases 4 to 6 -are the registry. Phases 7 to 8 are hardening. - -**Phase 1 · Make a build on any machine either correct or loud** (highest impact per line) - -- `scripts/fetch-binaries.mjs:342` extend the required-check to the three trees; add `--skip=` - that also drops the `extraResources` entry. -- `src/main/tools/soffice.ts:28` use `pathToFileURL().href`; add the spaced-path test in - `test/documents.test.ts`. -- `src/main/run.ts:40` typed `ToolMissingError`; `src/main/tools/registry.ts` map it to a real - message; fix `toolResolver.ts:181`'s probe flags (`mutool -v`, `caesiumclt --version`). -- `src/main/toolResolver.ts:43-48, 70` build roots from `%ProgramFiles%`. -- Touches: `scripts/fetch-binaries.mjs`, `electron-builder.yml`, `tools/soffice.ts`, `run.ts`, - `tools/registry.ts`, `toolResolver.ts`, `test/documents.test.ts`. - -**Phase 2 · Let the user say where ComfyUI is, from anywhere** - -- Un-gate the picker from `hasNvidia` (`OptionsPanel.tsx:405`) and from `engineReady` - (`ComfyImport.tsx:81`); add "Locate my ComfyUI" inline in `GenerateOptions` where the dead-end - text is today (`OptionsPanel.tsx:974`). -- Factor the triplicated roots/names lists (`discover.ts:21-36, 147-148`, `pythonEnv.ts:43-44`) - into one exported constant; enumerate real drive letters; add OneDrive-redirected paths. -- Add `resources/ComfyUI` depths and decouple interpreter from `main.py` root (`pythonEnv.ts:86`). -- Touches: `OptionsPanel.tsx`, `ComfyImport.tsx`, `comfy/discover.ts`, `comfy/pythonEnv.ts`. - -**Phase 3 · Stop lying about availability, and stop deadlocking** - -- `generate/comfy.ts:92` attach `stdout.resume()` + stderr-tail; bail on `exit`; include the tail in - the timeout error. (This is a live hang fix, not cosmetics.) -- `generate/comfy.ts:73` make `comfyGenerationAvailable` probe a live server; add a "ComfyUI server - URL" setting; bind our own launch to an ephemeral port. -- Render the `gguf` and `excluded` counts (`OptionsPanel.tsx:991`); replace `models.ts:111-114`'s - `continue` with a `runnable: false` push so nothing is invisible. -- Touches: `generate/comfy.ts`, `generate/models.ts`, `ipc.ts`, `OptionsPanel.tsx`. - -**Phase 4 · Ship the registry loader with today's data, no behaviour change** - -- New `src/shared/registry.ts` (types + `mergeRegistry` + `scoreDetect`, pure) and - `src/main/registry/load.ts` (three-layer load, schema validation, path constraints, provenance). -- Move `ARCH_INFO`, the four workflow graphs, `CLIP_REQ`, `EXTRA_NODES` and `requiredCompanions` - into `resources/registry/gen-archs.json` verbatim. `SUPPORTED` becomes "whatever the registry - has". Existing tests must pass unchanged; add a test asserting the shipped pack covers every - former `GenArch` id so packs and code cannot drift. -- Touches: new files, `shared/genArch.ts`, `generate/models.ts`, `generate/preflight.ts`, - `generate/archRegistry.ts`, `test/gen-registry.test.ts`. - -**Phase 5 · Integrity, then the user layer** - -- Add `sha256` to `DownloadSpec` and verify while streaming in `net/download.ts`; delete - `pid/install.ts:70-120`'s private fork and call `downloadFile` with - `minBytes = approxBytes * 0.9`. Switch both to `net.fetch` and map `err.cause.code` to real - messages. Pin every HF URL to a commit sha with the branch URL as the fallback mirror. -- Enable the `%APPDATA%/Filesmith/registry/user/` layer and the "Add a model" UI: point at a - file/folder, paste a URL, paste a ComfyUI API-format workflow. Show provenance on every row. -- Touches: `net/download.ts`, `pid/install.ts`, `generate/companions.ts`, `ipc.ts`, new UI. - -**Phase 6 · Retire the remaining hardcoded catalogs** - -- Real-ESRGAN: enumerate `resources/realesrgan/models/*.param` plus a user overlay under - `userData/models/realesrgan`; derive the picker from disk (`upscale.ts:13`, - `shared/compress.ts:70-73`, `fetch-binaries.mjs:255`). This un-freezes the only AI upscaler an - AMD/Intel user has. -- rembg: keep the vetted allowlist as a **licence** boundary but source it from the registry; - loosen `REMBG_SPEC` to `>=2.0.75,<3` (`toolResolver.ts:120`). -- PiD: `PID_BACKBONES` into the registry with a pinned commit sha; write the sha into `REPO_MARKER` - and reinstall on mismatch (`install.ts:135, 170`); take the backbone id from the renderer instead - of the literal `'flux'` (`ipc.ts:180-212`). -- spandrel: record the version in the marker (`install.ts:305-319`), compare against a registry - floor, and add an "Update upscale engine" button offered whenever a scan yields unsupported models. -- Content-based companion matching using `readSafetensorsHeader`, replacing the filename regexes - (`archRegistry.ts:33-133`), plus a "Choose a file I already have" picker. -- Derive the upscaler badge from `probe.arch` instead of `VERIFIED_TOKENS` (`shared/comfy.ts:32`). -- Touches: `tools/upscale.ts`, `shared/compress.ts`, `shared/removebg.ts`, `toolResolver.ts`, - `pid/paths.ts`, `pid/install.ts`, `ipc.ts`, `generate/archRegistry.ts`, `shared/comfy.ts`. - -**Phase 7 · Channel updates and the "try anyway" escape hatch** - -- Ed25519-signed channel refresh into layer 2, once a day, background, silent-fail-to-cache - (`crypto.verify`, no dependency). This is the lever that fixes a dead HF URL for everyone in a day. -- "Try anyway" on unknown generation models with a generic graph, surfacing ComfyUI's own error. -- Advisory (not terminal) non-image exclusion with word-boundary metadata matching - (`archScan.ts:119`). -- Per-arch dimension limits and size buckets from the registry, replacing the global 2048 clamp - (`shared/generate.ts:89-103`). - -**Phase 8 · Robustness and the remaining hardening** - -- Install lock + `mkdtempSync` temp dirs (`ipc.ts:182/221`, `install.ts:137/144/205`); disk-space - preflight via `fs.statfs`; `Range`-resumable downloads; a visible "Repair / remove AI install". -- Symlink-cycle guards on `models.ts:35`, `archRegistry.ts:152`, `discover.ts:188`; move the scan - off the main thread with an mtime-keyed cache. -- GPU compute-cap + driver floor before any multi-GB CUDA install (`gpu.ts:41`); torch spec and - index URL from the registry. -- Drop `.pt` from bulk scans; drop drive roots / Downloads / Desktop from implicit Python discovery - now that the picker exists; confirm the first spawn of a newly-discovered interpreter. -- Scheme-allowlist `index.ts:151`; quote the YAML scalar in `generate/comfy.ts:54`; shared - `src/main/uv.ts` with a PATH probe and the `/uv/uv.exe` candidate. -- Fixture-tree tests for every resolver (`test/`), per M12. - ---- - -## 7. Explicitly out of scope / accepted risks - -Things I looked at and am deliberately **not** recommending you fix. - -- **`sandbox: false` on both windows** (`index.ts:140`, `previewWindow.ts:38`). Turning it on is - cheap (the preload uses only `ipcRenderer` and `webUtils`) and worth doing eventually, but the - claimed exploit chain requires script execution the CSP already blocks, the main window renders no - untrusted markup, and the markdown path is sanitized. Defence in depth, not a live hole. Same for - confining `file:bytes` / `file:text` / `fsmedia://` to session-known paths. -- **Cross-platform support.** `paths.ts:25-29` has a platform branch and `install.ts:225/308` - hardcode `.venv/Scripts/python.exe`, but `electron-builder.yml:45-47` declares only - `win: target: nsis`. There is no macOS or Linux build to break. Unused generality, not a defect. -- **Zip-slip in the PiD/uv extraction.** Windows bsdtar rejects `..` and absolute members, the zips - come over TLS from `github.com/nv-tlabs` and `github.com/astral-sh`, and no failure was - demonstrated. Add the explicit reject in Phase 5 as belt-and-braces, do not treat it as a finding. -- **Binary planting via bare-name spawn.** I tested this: a renamed `whoami.exe` planted as - `mutool.exe` in the cwd did **not** execute; the real PATH `mutool` did. A name not on PATH failed - with ENOENT. Modern libuv's `search_path` walks PATH only and does not search the cwd or the - application directory, under both plain node 24.14 and Electron 43's runtime. The Win32 - `CreateProcess` search order does not apply because libuv resolves the image itself. The - "never fall back to a bare name" hardening is still worth doing, and Phase 1 covers it, but as - an error-message fix, not a security fix. -- **The rembg model allowlist as a concept.** `shared/removebg.ts:1-12` documents a real per-model - licence audit (bria-rmbg CC BY-NC, u2net_human_seg's Supervisely provenance, isnet-anime's scraped - provenance, sam being the wrong tool). Keep it vetted. Phase 6 moves _where the list lives_, not - _whether it is a list_. Do not open it up. -- **Localized Windows folder names.** Windows localizes only the Explorer display name; - `%USERPROFILE%\Desktop` and `\Documents` are the real on-disk paths, which is exactly what - `join(homedir(), 'Desktop')` produces. The genuine cases are OneDrive redirection and non-C/D/E - drives, both covered in Phase 2. -- **The `extra_model_paths.yaml` hand-rolled parser** (`discover.ts:97-122`). It genuinely misses - ComfyUI's multi-line block form, but `resolveExtraPaths` only feeds `resolveUpscaleDirs`, whose - four layout guesses already cover the normal cases, non-existent paths are silently discarded, and - the same models are found again via `comfyModelsBases()`. Bounded and cosmetic. -- **Unsigned NSIS installer.** Expected and documented in `CLAUDE.md`. Publish the installer's - sha256 with the GitHub Release and record bundled tool versions in a manifest inside the app; - that is the realistic ceiling without a code-signing certificate. -- **Reproducible `fetch-binaries.mjs` from a bare CI runner.** Worth doing (a `tools.lock.json` of - `{name, url, sha256, version}`, and pinning ffmpeg to a versioned artifact instead of - `-release-`), but it is a contributor-experience and supply-chain-audit improvement, not something - an end user hits at runtime. LibreOffice stays the documented `$LIBREOFFICE_DIR` exception; just - fail loudly when it is absent, which Phase 1 does. diff --git a/docs/design/mockup-active-convert.png b/docs/design/mockup-active-convert.png deleted file mode 100644 index 82f5138..0000000 Binary files a/docs/design/mockup-active-convert.png and /dev/null differ diff --git a/docs/design/mockup-empty-state.png b/docs/design/mockup-empty-state.png deleted file mode 100644 index 177cee8..0000000 Binary files a/docs/design/mockup-empty-state.png and /dev/null differ diff --git a/docs/design/redesign-direction.md b/docs/design/redesign-direction.md index 9b25292..39c03bf 100644 --- a/docs/design/redesign-direction.md +++ b/docs/design/redesign-direction.md @@ -3,7 +3,7 @@ **LOCKED IN (2026-10-04): `docs/mockups/terminal-v5/10-s2-vscode-grouped.html`** is the target design. Build the renderer to match it. The rest of this file is the feedback trail that led there. -Mockup rounds live in `docs/mockups/terminal*/` (each has an `index.html` gallery and `shots/`). +Only the chosen mockups are kept in `docs/mockups/`; the rejected rounds named below were removed and can be recovered from git (see `docs/mockups/README.md`). - **Dark only.** Light mode is being removed. Black or near-black background. Themes come later. - **Strict monochrome.** Greys only (r=g=b). Errors use a glyph and weight, never red. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..8d0909e --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,204 @@ +# Getting started + +How to install Filesmith, find your way around the main screen and run your first job. + +- What each operation does and its options: [operations.md](operations.md) +- The `filesmith` command line: [cli.md](cli.md) +- Upscale and Generate models: [models.md](models.md) + +## Install + +1. Download the installer from GitHub Releases. This link always points at the newest version: + + (each release also carries a versioned copy, `Filesmith-Setup-x64-.exe`). +2. Run it. The install is per-user, no admin rights needed. It goes to + `%LOCALAPPDATA%\Programs\Filesmith` and adds a Start menu shortcut (no desktop shortcut). +3. The installer also puts the `filesmith` command on your per-user PATH. Terminals opened after the + install see it; terminals that were already open do not. + +**The build is unsigned.** Windows SmartScreen may show "Windows protected your PC". Click +**More info**, then **Run anyway**. Releases stay unsigned until the project is enrolled for code +signing. + +Installing, updating or uninstalling closes every running `Filesmith.exe`, including a running CLI job. + +## First run + +Filesmith opens on **Convert** with an empty files table: "No files yet". Click **Add files**, press +**Ctrl+O**, or drag files anywhere onto the window. + +Core tools (ffmpeg, ImageMagick, mutool, CaesiumCLT, 7-Zip and the rest) ship with the app, so convert, +compress, resize and the PDF tools work offline straight away. Background removal downloads its model on +first use. Writing RAR or CBR needs WinRAR installed; without it those targets stay greyed out. + +## The main screen + +``` ++---------+-----------------------------------+-----------------------+ +| Sidebar | Toolbar: Add files, count, View | Inspector | +| |-----------------------------------| Options|Preview|Info | +| | Files table | | +| | | | +| |-----------------------------------| | +| | Console strip (Ctrl+`) | Run / Stop | ++---------+-----------------------------------+-----------------------+ +``` + +### Sidebar + +One entry per operation: **Convert**, **Compress**, **Resize**, **Upscale**, **Remove BG**, +**Generate** and **PDF Tools**, then **Completed** and **Settings**. + +- Each operation keeps its own list of files. A number next to an entry shows files waiting there. +- **PDF Tools** opens a grid of cards: Extract text, Pages to PNG, Merge, Split, Burst, Extract images. +- **Ctrl+B** or the collapse button folds the sidebar to icons. +- Order and visibility are set in [Settings](#settings). + +### Files table + +- **Add files:** the **Add files** button, **Ctrl+O**, or drag and drop onto the window. Files the + current operation cannot handle are skipped (Upscale does not take an MP4). +- Files are grouped by type (for example images, videos). A selection stays inside one group, because + the options panel describes one set of targets. Clicking a file in another group moves the selection + there. +- Click to select, **Ctrl+click** to add or remove, **Shift+click** for a range. Click a column header to + sort. +- Each row has a small action that follows its state: Cancel while running, Show in folder when done, + Retry after a failure or stop. +- Double-click or **Enter** opens the file in its default app. + +### Right-click menu + +Right-click a row (or press **Shift+F10** or the Menu key). On a selected row the menu acts on the whole +selection. + +| Item | What it does | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| Open in default app | Opens the file (one file only) | +| Show in File Explorer | Shows the result when the row is done, else the source | +| Retry | Runs failed or stopped files again with the options they last used | +| Stop | Cancels queued or running jobs | +| Clear finished | Hides finished and stopped rows from the list | +| Remove from list | Takes rows off the list after a confirm. Files on disk are not touched; running jobs stop | +| Delete file | Moves the **source** files to the Recycle Bin after a confirm. Results already made are kept. Off while a job is running | + +### View sizes + +Six sizes, named like File Explorer: **Details**, **Large details**, **Tiles**, **Medium icons**, +**Large icons**, **Extra large icons**. + +- The **View** menu in the toolbar lists Details, Tiles and Extra large icons. +- **Ctrl+wheel** over the files steps through all six. Wheel up is bigger. +- **Ctrl+=** (or **Ctrl++**) bigger, **Ctrl+-** smaller, **Ctrl+0** back to Details. +- **Large details** is the Details table with taller rows, bigger thumbnails and larger names. +- The size is remembered between sessions. + +![The files view at Large icons](screenshots/view-large-icons.png) + +### Inspector + +The right panel has three tabs: + +- **Options:** settings for the current operation, plus Output location (next to the source, or a + folder you choose). Options apply to the selected files, or to all files in the group when nothing is + selected. +- **Preview:** the selected file. Once a job is done, a wipe compares source and result: drag the divider, + or use the Left and Right arrow keys. +- **Info:** details of the selected file, including the output path and any error. + +Preview and Info show one file. With several selected, they ask you to pick one. + +## Running and stopping jobs + +1. Pick an operation in the sidebar and add files. +2. Set options in the inspector. +3. Click **Run** at the bottom of the inspector, or press **Ctrl+Enter**. The button names the work, for + example "Convert 3 images". + +Rows show live progress. While anything runs, **Run** turns into **Stop**, which cancels every queued and +running job in that operation. To stop only some files, use **Stop** in the right-click menu or the +row's Cancel action. + +## Outputs never overwrite + +Filesmith never overwrites your source or any existing file. + +- Results go next to the source by default, or to the folder set under Options, Output location. +- If the plain name is free and differs from the source, it is used: `photo.png` converts to `photo.jpg`. +- Otherwise a tag is added: `photo (converted).jpg`, then `photo (converted 2).jpg`, and so on. Other + operations use their own tag: `(compressed)`, `(resized)`, `(upscaled)`, `(no-bg)`. +- Output folders get `(2)`, `(3)`, and so on: `scans`, then `scans (2)`. + +## Completed + +**Completed** lists the results from every operation. + +- Columns: name, which operation made it, kind, size and result. +- Double-click opens the result. The folder icon shows it in File Explorer. +- Right-click: Open in default app, Show in File Explorer, Delete file (to the Recycle Bin). +- **Delete selected** moves the selected results to the Recycle Bin. +- **Clear list** only hides the list; files stay on disk. + +## Settings + +- **Sidebar:** drag rows to reorder the sidebar (or focus a row and press **Alt+Up** / **Alt+Down**). + Untick a row to hide it. +- **Tools:** status of WinRAR and background removal, the ComfyUI folder used by Generate (Choose or + Change folder), and **Open folder** buttons for your own Upscale models and the model registry. See + [models.md](models.md). +- **Claude:** installs or updates the Filesmith skill for Claude Code into + `%USERPROFILE%\.claude\skills\filesmith`, so Claude can run Filesmith for you through the CLI. + +![Settings: sidebar order, tools and the Claude skill](screenshots/settings.png) + +## Keyboard shortcuts + +| Keys | Action | +| --------------------- | ----------------------------------------------------------------------------------- | +| Ctrl+O | Add files | +| Ctrl+Enter | Run | +| Ctrl+B | Collapse or expand the sidebar | +| ``Ctrl+` `` | Open or close the console | +| Ctrl+wheel | Step the view size | +| Ctrl+= / Ctrl++ | Bigger view size | +| Ctrl+- | Smaller view size | +| Ctrl+0 | Back to Details | +| Arrow keys | Move between files (all four arrows in the grid views) | +| Shift+arrow | Extend the selection | +| Space | Select or deselect the focused file | +| Ctrl+A | Select all files in the active group | +| Enter | Open the focused file in its default app | +| Delete | Remove the selected files from the list (asks first; files on disk are not touched) | +| Shift+F10 or Menu key | Open the right-click menu | + +View-size keys only work in the files view, and not while you type in a text field or the console. + +## The console + +The **Console** button in the bottom strip (or ``Ctrl+` ``) opens a console panel under the files table. +It runs **filesmith commands only**, without the `filesmith` prefix: `convert`, `compress`, `resize`, +`upscale`, `removebg`, `generate ""`, `pdf `, and the helpers `formats`, `doctor`, +`setup`, `skill`. Anything else is refused with "Only filesmith commands run here". Use a terminal for +other programs. The full command reference is in [cli.md](cli.md). + +Built-ins: + +| Command | What it does | +| ------------- | ----------------------------------------------------- | +| `help` | What the console runs | +| `cd ` | Change folder. `cd` alone prints it, `cd -` goes back | +| `history` | Past commands | +| `clear` | Clear the output (also **Ctrl+L**) | + +- Commands run in the console's folder, which starts at your Downloads folder and is remembered. +- Add `--help` to a command for its options. **Tab** completes commands and file names. +- **Up** and **Down** walk your history. +- **Ctrl+C** or the **Stop** button cancels a running command. With nothing running, Ctrl+C clears the + prompt. If text is selected, Ctrl+C copies it instead. +- **Clear** empties the output. **Minimise** closes the panel; the strip then shows the running + command's progress. +- Drag the top edge to resize the panel. **Esc** returns focus to the files table. +- Console jobs do not appear in the app's queue or Completed view, and the app's queue keeps working + while one runs. + +![The console open under the files table after a convert run](screenshots/console.png) diff --git a/docs/mockups/README.md b/docs/mockups/README.md new file mode 100644 index 0000000..3d3669e --- /dev/null +++ b/docs/mockups/README.md @@ -0,0 +1,47 @@ +# Mockups + +Only the designs the owner signed off are kept here, with the screenshots the build was checked +against. Open the `.html` files directly in a browser. The design rules and feedback trail are in +[`../design/redesign-direction.md`](../design/redesign-direction.md). + +## Kept + +| Path | What it is | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `terminal-v5/10-s2-vscode-grouped.html` | The signed-off app design (2026-10-04): dark, monochrome, files table, right inspector. | +| `terminal-v5/shots/10-s2-vscode-grouped.png` | Screenshot of that mockup. | +| `terminal-v5/shots/impl-*.png` | The built app next to the mockup. Written by `e2e/visual.spec.ts`. | +| `view-zoom/04-explorer-style.html` | The chosen view sizes design (2026-10-05). Interactive: Ctrl+wheel, `#size=0..4`, `#menu`. | +| `view-zoom/shots/04-explorer-style-*.png` | Screenshots of that mockup, one per size plus the View menu. | +| `view-zoom/shots/impl-*.png` | The built app at each size. Written by `e2e/visual.spec.ts`. | +| `console/01-bottom-panel.html` | The chosen console design (2026-10-06). Interactive: `#state=closed`, `open-idle`, `running`, `error`, `rejected`, `completion`, `history`. | +| `console/shots/01-bottom-panel-*.png` | Screenshots of that mockup, one per state. | +| `console/shots/impl-*.png` | The built console. Written by `e2e/visual.spec.ts`. | +| `generate-empty/*.png` | The Generate screen with no model, before and after, plus Settings. `after.png` and `settings.png` are written by `e2e/generate-empty.spec.ts`. | +| `cli-settings-skill.png` | Settings with the CLI and Claude skill section. Written by `e2e/skill.spec.ts`. | + +The `impl-*` and spec-written shots are refreshed with `FILESMITH_SHOTS=1 npm run test:e2e` after +`npm run build`. + +## Removed rounds + +The rejected rounds were removed on 2026-10-06 (issue #25). The last commit that still has all of +them is `cc639ad`. To get one back: + +```powershell +git checkout cc639ad -- docs/mockups/terminal-v4 +``` + +| Folder or file | What it was | +| ------------------------------------ | ------------------------------------------------------------------------------- | +| `claude/` to `claude-v6/` | File-type navigation concepts and switcher/pill variations (July 2026). | +| `codex/` | Operation placement concepts made with Codex (July 2026). | +| `icons/icon-sheet.html` | An early icon set sheet. | +| `terminal/` | Round 1 of the terminal redesign, 20 mockups. Rejected: too cluttered. | +| `terminal-v2/` | Round 2, 20 mockups. Rejected: too minimal. | +| `terminal-v3/` | Round 3, 20 mockups. Too close to Wind's settings page. | +| `terminal-v4/` | Round 4, 20 IDE-inspired mockups. `10-explorer-details` led to v5. | +| `terminal-v5/` (all but `10-s2`) | The v5 variations and their gallery `index.html`. | +| `view-zoom/01` to `03`, `index.html` | The other view size options and their gallery. | +| `console/02` to `04`, `index.html` | The other console options and their gallery. | +| `../design/mockup-*.png` | Two early mockup images (active convert, empty state) that nothing referenced. | diff --git a/docs/mockups/claude-v2/A-grid-images.html b/docs/mockups/claude-v2/A-grid-images.html deleted file mode 100644 index ff42fab..0000000 --- a/docs/mockups/claude-v2/A-grid-images.html +++ /dev/null @@ -1,110 +0,0 @@ -
Filesmith
–
◻
✕
File types

Images

-
Choose what to do. You can add files on the next step.
-
Convert
Change format (PNG, WebP, AVIF)
Compress
Shrink file size
Resize
Scale by percent or exact size
Image Upscale
Enlarge 2x to 4x with AI
Remove Background
Cut the subject out
-
\ No newline at end of file diff --git a/docs/mockups/claude-v2/B-workspace.html b/docs/mockups/claude-v2/B-workspace.html deleted file mode 100644 index e49d701..0000000 --- a/docs/mockups/claude-v2/B-workspace.html +++ /dev/null @@ -1,128 +0,0 @@ -
Filesmith
–
◻
✕
File types
-
- Images/Compress
-

Compress images

-
Only images can be added here.
-
Drop images here | or browse
-
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
- -
Operation
Compress
- -
-
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v2/C-workspace-switcher-open.html b/docs/mockups/claude-v2/C-workspace-switcher-open.html deleted file mode 100644 index 596adb0..0000000 --- a/docs/mockups/claude-v2/C-workspace-switcher-open.html +++ /dev/null @@ -1,128 +0,0 @@ -
Filesmith
–
◻
✕
File types
-
- Images/Compress
-

Compress images

-
Only images can be added here.
-
Drop images here | or browse
-
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
- -
Operation
Compress
- -
-
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v2/D-grid-pdf.html b/docs/mockups/claude-v2/D-grid-pdf.html deleted file mode 100644 index eff6d7d..0000000 --- a/docs/mockups/claude-v2/D-grid-pdf.html +++ /dev/null @@ -1,110 +0,0 @@ -
Filesmith
–
◻
✕
File types

PDF

-
Choose what to do. You can add files on the next step.
-
Extract text
Save the text layer as .txt
Pages to PNG
Render each page to an image
Merge
Combine PDFs into one
Split
Keep only the pages you list
Burst
Save every page separately
Extract images
Pull out embedded images
Compress
Shrink file size
-
\ No newline at end of file diff --git a/docs/mockups/claude-v2/E-grid-rows.html b/docs/mockups/claude-v2/E-grid-rows.html deleted file mode 100644 index f7868a1..0000000 --- a/docs/mockups/claude-v2/E-grid-rows.html +++ /dev/null @@ -1,110 +0,0 @@ -
Filesmith
–
◻
✕
File types

Images

-
Choose what to do. You can add files on the next step.
-
Convert
Change format (PNG, WebP, AVIF)
Compress
Shrink file size
Resize
Scale by percent or exact size
Image Upscale
Enlarge 2x to 4x with AI
Remove Background
Cut the subject out
-
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V1-quiet-type-open.html b/docs/mockups/claude-v3/V1-quiet-type-open.html deleted file mode 100644 index bf7611a..0000000 --- a/docs/mockups/claude-v3/V1-quiet-type-open.html +++ /dev/null @@ -1,104 +0,0 @@ -V1 quiet type, open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
-
- Compress - -
-
Images
-
-
Convert
Compress
Resize
Image Upscale
Remove Background
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V1-quiet-type.html b/docs/mockups/claude-v3/V1-quiet-type.html deleted file mode 100644 index f1b4f89..0000000 --- a/docs/mockups/claude-v3/V1-quiet-type.html +++ /dev/null @@ -1,104 +0,0 @@ -V1 quiet type, closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
-
- Compress - -
-
Images
-
- -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V2-native-select-open.html b/docs/mockups/claude-v3/V2-native-select-open.html deleted file mode 100644 index 43fae57..0000000 --- a/docs/mockups/claude-v3/V2-native-select-open.html +++ /dev/null @@ -1,104 +0,0 @@ -V2 native select, open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
-
Operation
-
- Compress
-
-
Convert
Compress
Resize
Image Upscale
Remove Background
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V2-native-select.html b/docs/mockups/claude-v3/V2-native-select.html deleted file mode 100644 index fb4ad76..0000000 --- a/docs/mockups/claude-v3/V2-native-select.html +++ /dev/null @@ -1,104 +0,0 @@ -V2 native select, closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
-
Operation
-
- Compress
-
- -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V3-title-menu-open.html b/docs/mockups/claude-v3/V3-title-menu-open.html deleted file mode 100644 index b750220..0000000 --- a/docs/mockups/claude-v3/V3-title-menu-open.html +++ /dev/null @@ -1,101 +0,0 @@ -V3 title menu, open -
Filesmith
–
◻
✕
File types
-
-

Compress - -

-
Images, 4 files
-
Convert
Change format
Compress
Shrink file size
Resize
Scale by percent or size
Image Upscale
Enlarge 2x to 4x with AI
Remove Background
Cut the subject out
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V3-title-menu.html b/docs/mockups/claude-v3/V3-title-menu.html deleted file mode 100644 index cf0886a..0000000 --- a/docs/mockups/claude-v3/V3-title-menu.html +++ /dev/null @@ -1,101 +0,0 @@ -V3 title menu, closed -
Filesmith
–
◻
✕
File types
-
-

Compress - -

-
Images, 4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V4-glyph-pill-open.html b/docs/mockups/claude-v3/V4-glyph-pill-open.html deleted file mode 100644 index d7dfd37..0000000 --- a/docs/mockups/claude-v3/V4-glyph-pill-open.html +++ /dev/null @@ -1,105 +0,0 @@ -V4 glyph pill, open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
- - Compress - - -
-
ConvertChange format
CompressShrink file size
ResizeScale by percent or size
Image UpscaleEnlarge 2x to 4x with AI
Remove BackgroundCut the subject out
-
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v3/V4-glyph-pill.html b/docs/mockups/claude-v3/V4-glyph-pill.html deleted file mode 100644 index 7edce7a..0000000 --- a/docs/mockups/claude-v3/V4-glyph-pill.html +++ /dev/null @@ -1,105 +0,0 @@ -V4 glyph pill, closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
- - Compress - - -
- -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A1-square-chevron-open.html b/docs/mockups/claude-v4/A1-square-chevron-open.html deleted file mode 100644 index fdcb920..0000000 --- a/docs/mockups/claude-v4/A1-square-chevron-open.html +++ /dev/null @@ -1,98 +0,0 @@ -A1 open -
Filesmith
–
◻
✕
File types
-
-

Compress -

-
Images, 4 files
Convert
Change format
Compress
Shrink file size
Resize
Scale by percent or size
Image Upscale
Enlarge 2x to 4x with AI
Remove Background
Cut the subject out
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A1-square-chevron.html b/docs/mockups/claude-v4/A1-square-chevron.html deleted file mode 100644 index c730d9c..0000000 --- a/docs/mockups/claude-v4/A1-square-chevron.html +++ /dev/null @@ -1,98 +0,0 @@ -A1 closed -
Filesmith
–
◻
✕
File types
-
-

Compress -

-
Images, 4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A2-bare-chevron-open.html b/docs/mockups/claude-v4/A2-bare-chevron-open.html deleted file mode 100644 index 99f661b..0000000 --- a/docs/mockups/claude-v4/A2-bare-chevron-open.html +++ /dev/null @@ -1,97 +0,0 @@ -A2 open -
Filesmith
–
◻
✕
File types
-
-

Compress -

-
Images, 4 files
Convert
Compress
Resize
Image Upscale
Remove Background
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A2-bare-chevron.html b/docs/mockups/claude-v4/A2-bare-chevron.html deleted file mode 100644 index 651e35c..0000000 --- a/docs/mockups/claude-v4/A2-bare-chevron.html +++ /dev/null @@ -1,97 +0,0 @@ -A2 closed -
Filesmith
–
◻
✕
File types
-
-

Compress -

-
Images, 4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A3-underlined-verb-open.html b/docs/mockups/claude-v4/A3-underlined-verb-open.html deleted file mode 100644 index e3b64ef..0000000 --- a/docs/mockups/claude-v4/A3-underlined-verb-open.html +++ /dev/null @@ -1,99 +0,0 @@ -A3 open -
Filesmith
–
◻
✕
File types
-
-

- Compress - - images

-
4 files
Convert
Compress
Resize
Image Upscale
Remove Background
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A3-underlined-verb.html b/docs/mockups/claude-v4/A3-underlined-verb.html deleted file mode 100644 index 2a7d5ad..0000000 --- a/docs/mockups/claude-v4/A3-underlined-verb.html +++ /dev/null @@ -1,99 +0,0 @@ -A3 closed -
Filesmith
–
◻
✕
File types
-
-

- Compress - - images

-
4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A4-tinted-icon-open.html b/docs/mockups/claude-v4/A4-tinted-icon-open.html deleted file mode 100644 index 156dc0d..0000000 --- a/docs/mockups/claude-v4/A4-tinted-icon-open.html +++ /dev/null @@ -1,100 +0,0 @@ -A4 open -
Filesmith
–
◻
✕
File types
-
-

- - Compress -

-
Images, 4 files
Convert
Change format
Compress
Shrink file size
Resize
Scale by percent or size
Image Upscale
Enlarge 2x to 4x with AI
Remove Background
Cut the subject out
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/A4-tinted-icon.html b/docs/mockups/claude-v4/A4-tinted-icon.html deleted file mode 100644 index 48566e1..0000000 --- a/docs/mockups/claude-v4/A4-tinted-icon.html +++ /dev/null @@ -1,100 +0,0 @@ -A4 closed -
Filesmith
–
◻
✕
File types
-
-

- - Compress -

-
Images, 4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B1-neutral-card-open.html b/docs/mockups/claude-v4/B1-neutral-card-open.html deleted file mode 100644 index 7c66bab..0000000 --- a/docs/mockups/claude-v4/B1-neutral-card-open.html +++ /dev/null @@ -1,99 +0,0 @@ -B1 open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
Convert
Compress
Resize
Image Upscale
Remove Background
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B1-neutral-card.html b/docs/mockups/claude-v4/B1-neutral-card.html deleted file mode 100644 index 1ad49e8..0000000 --- a/docs/mockups/claude-v4/B1-neutral-card.html +++ /dev/null @@ -1,99 +0,0 @@ -B1 closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B2-caption-only-open.html b/docs/mockups/claude-v4/B2-caption-only-open.html deleted file mode 100644 index 8017669..0000000 --- a/docs/mockups/claude-v4/B2-caption-only-open.html +++ /dev/null @@ -1,99 +0,0 @@ -B2 open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Operation
-
- Compress -
Convert
Compress
Resize
Image Upscale
Remove Background
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B2-caption-only.html b/docs/mockups/claude-v4/B2-caption-only.html deleted file mode 100644 index 556626b..0000000 --- a/docs/mockups/claude-v4/B2-caption-only.html +++ /dev/null @@ -1,99 +0,0 @@ -B2 closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Operation
-
- Compress -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B3-colour-dot-open.html b/docs/mockups/claude-v4/B3-colour-dot-open.html deleted file mode 100644 index 99402ff..0000000 --- a/docs/mockups/claude-v4/B3-colour-dot-open.html +++ /dev/null @@ -1,99 +0,0 @@ -B3 open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
Convert
Compress
Resize
Image Upscale
Remove Background
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B3-colour-dot.html b/docs/mockups/claude-v4/B3-colour-dot.html deleted file mode 100644 index cd21d66..0000000 --- a/docs/mockups/claude-v4/B3-colour-dot.html +++ /dev/null @@ -1,99 +0,0 @@ -B3 closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B4-soft-grey-panel-open.html b/docs/mockups/claude-v4/B4-soft-grey-panel-open.html deleted file mode 100644 index 0d2b7af..0000000 --- a/docs/mockups/claude-v4/B4-soft-grey-panel-open.html +++ /dev/null @@ -1,100 +0,0 @@ -B4 open -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
Convert
Compress
Resize
Image Upscale
Remove Background
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v4/B4-soft-grey-panel.html b/docs/mockups/claude-v4/B4-soft-grey-panel.html deleted file mode 100644 index b7d620d..0000000 --- a/docs/mockups/claude-v4/B4-soft-grey-panel.html +++ /dev/null @@ -1,100 +0,0 @@ -B4 closed -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Options
-
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/01-accent-fill.html b/docs/mockups/claude-v5/01-accent-fill.html deleted file mode 100644 index e0d6c66..0000000 --- a/docs/mockups/claude-v5/01-accent-fill.html +++ /dev/null @@ -1,96 +0,0 @@ -01-accent-fill -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/02-operation-colour.html b/docs/mockups/claude-v5/02-operation-colour.html deleted file mode 100644 index 902b229..0000000 --- a/docs/mockups/claude-v5/02-operation-colour.html +++ /dev/null @@ -1,96 +0,0 @@ -02-operation-colour -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/03-dark-inverted.html b/docs/mockups/claude-v5/03-dark-inverted.html deleted file mode 100644 index 0619c8f..0000000 --- a/docs/mockups/claude-v5/03-dark-inverted.html +++ /dev/null @@ -1,96 +0,0 @@ -03-dark-inverted -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/04-big-type.html b/docs/mockups/claude-v5/04-big-type.html deleted file mode 100644 index 43193d4..0000000 --- a/docs/mockups/claude-v5/04-big-type.html +++ /dev/null @@ -1,95 +0,0 @@ -04-big-type -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Operation
-
- Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/05-left-bar.html b/docs/mockups/claude-v5/05-left-bar.html deleted file mode 100644 index 3bb2168..0000000 --- a/docs/mockups/claude-v5/05-left-bar.html +++ /dev/null @@ -1,95 +0,0 @@ -05-left-bar -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/06-elevated-pill.html b/docs/mockups/claude-v5/06-elevated-pill.html deleted file mode 100644 index 0f3c0ed..0000000 --- a/docs/mockups/claude-v5/06-elevated-pill.html +++ /dev/null @@ -1,97 +0,0 @@ -06-elevated-pill -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress - -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/07-underline-tab.html b/docs/mockups/claude-v5/07-underline-tab.html deleted file mode 100644 index 82c20dc..0000000 --- a/docs/mockups/claude-v5/07-underline-tab.html +++ /dev/null @@ -1,96 +0,0 @@ -07-underline-tab -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/08-mode-badge.html b/docs/mockups/claude-v5/08-mode-badge.html deleted file mode 100644 index 74ccc3c..0000000 --- a/docs/mockups/claude-v5/08-mode-badge.html +++ /dev/null @@ -1,97 +0,0 @@ -08-mode-badge -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress - MODE -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/09-gradient-tint.html b/docs/mockups/claude-v5/09-gradient-tint.html deleted file mode 100644 index 252cea9..0000000 --- a/docs/mockups/claude-v5/09-gradient-tint.html +++ /dev/null @@ -1,96 +0,0 @@ -09-gradient-tint -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v5/10-serif-label.html b/docs/mockups/claude-v5/10-serif-label.html deleted file mode 100644 index ad48570..0000000 --- a/docs/mockups/claude-v5/10-serif-label.html +++ /dev/null @@ -1,96 +0,0 @@ -10-serif-label -
Filesmith
–
◻
✕
File types
-

Compress images

4 files
-
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
- - Compress -
-
Format
-
Keep format
-
- Quality72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude-v6/1-switcher-only.html b/docs/mockups/claude-v6/1-switcher-only.html deleted file mode 100644 index c34fd6f..0000000 --- a/docs/mockups/claude-v6/1-switcher-only.html +++ /dev/null @@ -1,132 +0,0 @@ -1 switcher only
Filesmith
–
◻
✕
File types

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
Format
Keep format
Quality72
Strip metadata
Compress 2 files
- \ No newline at end of file diff --git a/docs/mockups/claude-v6/2-follow-all.html b/docs/mockups/claude-v6/2-follow-all.html deleted file mode 100644 index 8628f12..0000000 --- a/docs/mockups/claude-v6/2-follow-all.html +++ /dev/null @@ -1,132 +0,0 @@ -2 sidebar follows operation
Filesmith
–
◻
✕
File types

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
Format
Keep format
Quality72
Strip metadata
Compress 2 files
- \ No newline at end of file diff --git a/docs/mockups/claude-v6/3-separate-picker.html b/docs/mockups/claude-v6/3-separate-picker.html deleted file mode 100644 index 5496167..0000000 --- a/docs/mockups/claude-v6/3-separate-picker.html +++ /dev/null @@ -1,132 +0,0 @@ -3 separate colour picker
Filesmith
–
◻
✕
File types

Compress images

4 files
Drop images here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
Control colour
Sliders & buttons#12b3a6
Format
Keep format
Quality72
Strip metadata
Compress 2 files
- \ No newline at end of file diff --git a/docs/mockups/claude/1-sidebar-list.html b/docs/mockups/claude/1-sidebar-list.html deleted file mode 100644 index 343b45a..0000000 --- a/docs/mockups/claude/1-sidebar-list.html +++ /dev/null @@ -1,88 +0,0 @@ - -
Filesmith
–
◻
✕
File types
-

Images

4 files
-
Drop files here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Operation
Convert
Compress
Resize
Image Upscale
Remove Background
-
- -
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude/1b-sidebar-list-PDF.html b/docs/mockups/claude/1b-sidebar-list-PDF.html deleted file mode 100644 index 6e3d39b..0000000 --- a/docs/mockups/claude/1b-sidebar-list-PDF.html +++ /dev/null @@ -1,85 +0,0 @@ - -
Filesmith
–
◻
✕
File types
-

PDF

3 files
-
Drop files here | or browse
Input3 items
report-part1.pdf
2.9 MB
brochure.pdf
8.1 MB
41%
invoice-2026.pdf
410 KB
Output1 item
report-part1 (compressed).pdf
640 KB -78%
-
Operation
-
Extract text
Pages to PNG
Merge
Split
Burst
Extract images
Compress
-
-
Level
Balanced
-
Convert to grayscale -
-
Compress 1 file
\ No newline at end of file diff --git a/docs/mockups/claude/2-centre-tabs.html b/docs/mockups/claude/2-centre-tabs.html deleted file mode 100644 index 724e4a9..0000000 --- a/docs/mockups/claude/2-centre-tabs.html +++ /dev/null @@ -1,91 +0,0 @@ - -
Filesmith
–
◻
✕
File types
-

Images

4 files
-
Convert
Compress
Resize
Image Upscale
Remove Background
Drop files here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
- -
Compress
-
2 of 4 selected
-
- -
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude/2b-centre-tabs-PDF.html b/docs/mockups/claude/2b-centre-tabs-PDF.html deleted file mode 100644 index f33f8ce..0000000 --- a/docs/mockups/claude/2b-centre-tabs-PDF.html +++ /dev/null @@ -1,88 +0,0 @@ - -
Filesmith
–
◻
✕
File types
-

PDF

3 files
-
Extract text
Pages to PNG
Merge
Split
Burst
Extract images
Compress
-
Drop files here | or browse
Input3 items
report-part1.pdf
2.9 MB
brochure.pdf
8.1 MB
41%
invoice-2026.pdf
410 KB
Output1 item
report-part1 (compressed).pdf
640 KB -78%
-
- -
Compress
-
1 of 3 selected
-
-
Level
Balanced
-
Convert to grayscale -
-
Compress 1 file
\ No newline at end of file diff --git a/docs/mockups/claude/3-nested-rail.html b/docs/mockups/claude/3-nested-rail.html deleted file mode 100644 index 3d9992b..0000000 --- a/docs/mockups/claude/3-nested-rail.html +++ /dev/null @@ -1,88 +0,0 @@ - -
Filesmith
–
◻
✕
File types
Convert
Compress
Resize
Image Upscale
Remove Background
-

Compress

Images, 4 files
-
Drop files here | or browse
-
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
Compress options
-
Images, 2 selected
- -
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude/4-sidebar-chips.html b/docs/mockups/claude/4-sidebar-chips.html deleted file mode 100644 index 758374d..0000000 --- a/docs/mockups/claude/4-sidebar-chips.html +++ /dev/null @@ -1,89 +0,0 @@ - -
Filesmith
–
◻
✕
File types
-

Images

4 files
-
Drop files here | or browse
Input4 items
IMG_1837.png
3.4 MB
receipt-scan.jpg
1.2 MB
62%
product-shot.png
5.8 MB
logo-draft.png
240 KB
Output2 items
IMG_1837 (compressed).png
1.1 MB -68%
receipt-scan (compressed).jpg
410 KB -66%
-
-
Operation
-
ConvertCompressResizeUpscaleRemove BG
-
- -
Format
Keep format
-
Quality - 72
-
-
Strip metadata
-
Compress 2 files
\ No newline at end of file diff --git a/docs/mockups/claude/README.md b/docs/mockups/claude/README.md deleted file mode 100644 index 86c1027..0000000 --- a/docs/mockups/claude/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# File-type navigation: four concepts - -The left rail becomes **file types** (Images, Video, Audio, PDF, Documents). The open -question is where the **operations** go. Every mockup below shares the same title bar, -left rail and queue layout, so the only variable is the answer to that question. - -Open the `.html` files directly in a browser, or view the rendered PNGs. - -| File | Concept | -| --- | --- | -| `1-sidebar-list.html` | Operation list at the top of the right sidebar | -| `2-centre-tabs.html` | Operations as a tab strip across the centre | -| `3-nested-rail.html` | Operations nested under the file type in the left rail | -| `4-sidebar-chips.html` | Operations as wrapping chips in the right sidebar | -| `1b-sidebar-list-PDF.html` | Concept 1 under load: PDF's seven operations | -| `2b-centre-tabs-PDF.html` | Concept 2 under load: PDF's seven operations | - -## The load case that separates them - -Images has five operations, but **PDF has seven** (Extract text, Pages to PNG, Merge, -Split, Burst, Extract images, Compress). Any concept that only works for Images is not a -concept, so both leading candidates were rendered with PDF selected. - -Result: the centre tab strip does fit seven tabs at 1400px wide, but only just. It -consumes the full centre width with no slack, so a narrower window or one longer -operation name pushes it into scrolling or wrapping. The sidebar list absorbs seven -entries without stress, since it grows downward into space that is otherwise empty. - -## Trade-offs - -**1. Sidebar list.** Operation and its options are in one column, read top to bottom, and -the primary button sits directly below. Scales to any operation count. Costs the most -vertical space in the sidebar, so with seven operations the options sit lower. - -**2. Centre tabs.** The most conventional pattern, and the operation is legible at a -glance from across the screen. Keeps the sidebar purely for options. But it competes with -the page title for the top of the centre column, and it is the only concept with a real -width ceiling. - -**3. Nested rail.** Everything navigational lives in one place, and the whole hierarchy -(type, then operation) is visible at once. Reads like a file tree, which suits a utility. -The rail grows tall, and the current operation is far from the options panel it controls. - -**4. Sidebar chips.** The most compact, leaving maximum room for options. But chips wrap -into ragged rows, long names need abbreviating ("Remove BG", "Upscale"), and the colour -swatches carry less meaning than the real icons. - -## Recommendation - -**Concept 1, the sidebar list.** It matches the stated instinct to put operations on the -right, it is the only layout that keeps operation, options and action in one vertical -reading order, and it is the one that absorbs PDF's seven operations without strain. -Concept 3 is the strongest alternative if the operation should stay visible while the -sidebar scrolls. diff --git a/docs/mockups/codex/README.md b/docs/mockups/codex/README.md deleted file mode 100644 index bcab233..0000000 --- a/docs/mockups/codex/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Filesmith operation placement concepts - -These mockups explore where operations can live after the left rail changes from tools to file types. Each screen uses PDF as the active type because its seven operations are the strongest layout test. The queue also includes recent image work so the relationship between file type navigation and a persistent multi-file queue stays visible. - -## Concept 1: Operation Inspector - -File types stay in the left rail and operations move into the top half of the right inspector. Selecting an operation reveals its settings directly below, while the primary action remains pinned at the bottom. - -PDF's seven operations use a compact two-column matrix. All seven remain visible at once, with Compress spanning a normal grid cell and the selected state linking it clearly to the settings section. - -Trade-offs: - -- This follows the user's instinct and preserves the current three-column mental model. -- Operation choice and configuration feel like one continuous task. -- The right panel becomes dense for PDF, leaving less room for detailed settings. -- Long operation names or future PDF actions could require scrolling. - -## Concept 2: Command Shelf - -Operations live in a horizontal command shelf directly under the file type heading. The right sidebar is reserved for settings, estimates, and the primary action. - -PDF's seven operations are divided into meaningful visual groups: extraction, document structure, and optimization. The shelf uses the full workspace width, so every action is visible without an overflow menu while the active operation remains easy to scan. - -Trade-offs: - -- Operations are highly discoverable and can be compared quickly. -- Settings get the full right sidebar and can grow without displacing the operation chooser. -- The shelf uses vertical space above the working queue. -- If a file type gains many more operations, grouping or a second row would be needed. - -## Concept 3: Workflow Canvas - -Operations live in a central recipe builder. The selected operation, its settings, the input files, and the output preview read as one batch workflow. The permanent right sidebar is removed, and the primary action moves to a full-width footer. - -PDF's seven operations appear as a stable card catalog in the recipe builder. All seven fit in a four-column grid, and the adjacent configuration panel gives the active operation room for settings without shrinking the catalog. - -Trade-offs: - -- The workflow is explicit and supports batch processing well. -- It offers the most room for future settings and multi-step recipes. -- It is the largest departure from the current Filesmith layout. -- Users who frequently switch operations may find the recipe framing heavier than a simple tool switch. - -## Recommendation - -Concept 2, Command Shelf, is recommended because it keeps all seven PDF operations immediately visible, protects the right sidebar for focused settings, and introduces the smallest structural change to the existing app. - -## Files - -- `codex-1.html`: Operation Inspector -- `codex-2.html`: Command Shelf -- `codex-3.html`: Workflow Canvas diff --git a/docs/mockups/codex/codex-1.html b/docs/mockups/codex/codex-1.html deleted file mode 100644 index 2896e1b..0000000 --- a/docs/mockups/codex/codex-1.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - -Filesmith Concept 1, Operation Inspector - - - -
-
-
FFilesmith
-
Processing stays on this PC
-
─□×
-
-
- - -
-
-

PDF workspace

Prepare, extract, combine, or reduce PDF files.

-
Offline and private
-
-
-
+
-
Drop PDF files hereUp to 2 GB per file
- -
-
4 files, 40.9 MB total
-
-
-
InputOriginal
-
-
PDF
brochure.pdf24.8 MB · 36 pages
Compressing
-
Optimizing images68%
-
-
-
JPG
receipt-scan.jpg4.8 MB · 3024 × 4032
✓Done
-
-
-
PNG
IMG_1837.png9.4 MB · 4096 × 2731
Queued
-
-
-
PDF
meeting-notes.pdf1.9 MB · 8 pages
✓Done
-
-
-
-
OutputProcessed
-
-
PDF
brochure-compressed.pdf12.1 MB estimated
−51%
-
Writing outputDownloads\Filesmith
-
-
-
JPG
receipt-scan-small.jpg1.7 MB
−65%
-
Saved3.1 MB smaller
-
-
-
PNG
IMG_1837-small.pngWaiting for current file
−48%
-
Estimated4.9 MB output
-
-
-
PDF
meeting-notes-small.pdf1.2 MB
−37%
-
Saved0.7 MB smaller
-
-
-
-
- - -
-
- - diff --git a/docs/mockups/codex/codex-2.html b/docs/mockups/codex/codex-2.html deleted file mode 100644 index f43591a..0000000 --- a/docs/mockups/codex/codex-2.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - -Filesmith Concept 2, Command Shelf - - - -
-
-
FFilesmith
-
PDF workspace
-
─□×
-
-
- - -
-
-
-

What should Filesmith do?

PDF operations stay within reach while settings remain focused.

- 7 PDF operations -
-
-
-
TExtract text
-
▦Pages to PNG
-
▧Extract images
-
-
-
+Merge
-
↔Split
-
✣Burst
-
-
-
↓Compress
-
-
-
- -
-
-
-
+
-
Add files to CompressPDF, PNG, and JPG files are accepted in this batch
- -
-
4 files · 40.9 MB
-
-
-
InputOriginal size
-
-
PDF
brochure.pdf24.8 MB · 36 pages
Compressing
-
Repacking images54%
-
-
JPG
receipt-scan.jpg4.8 MB · 3024 × 4032
✓Done
-
PNG
IMG_1837.png9.4 MB · 4096 × 2731
Queued
-
PDF
travel-expenses.pdf1.9 MB · 8 pages
✓Done
-
-
-
OutputSize reduction
-
-
PDF
brochure-compressed.pdf12.1 MB estimated
−51%
-
Processing12.7 MB smaller
-
-
JPG
receipt-scan-small.jpg1.7 MB
−65%
Saved3.1 MB smaller
-
PNG
IMG_1837-small.png4.9 MB estimated
−48%
Queued4.5 MB smaller
-
PDF
travel-expenses-small.pdf1.2 MB
−37%
Saved0.7 MB smaller
-
-
-
- - -
-
-
-
- - diff --git a/docs/mockups/codex/codex-3.html b/docs/mockups/codex/codex-3.html deleted file mode 100644 index da17862..0000000 --- a/docs/mockups/codex/codex-3.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - -Filesmith Concept 3, Workflow Canvas - - - -
-
-
FFilesmith
-
Local workflow draft saved
-
─□×
-
-
- - -
-
-

Build a PDF job

The operation and its settings live together in the workflow canvas.

-
1Operation selected  2Files added  3Run
-
- -
-
-
Choose an operation7 available for PDF
-
-
T
Extract text
-
▦
Pages to PNG
-
+
Merge
-
↔
Split
-
✣
Burst
-
▧
Extract images
-
↓
Compress
-
-
-
-
Configure CompressActive recipe
-
Reduce file size while keeping text and diagrams clear.
-
SmallBalancedSharp
-
72%⌄
-
Filesmith⌄
-
-
- -
-
+
Drop files into this recipe4 files added, 40.9 MB total
-
- -
Input mapped directly to output
- -
-
-
InputOriginal
-
-
PDF
brochure.pdf24.8 MB · 36 pages
Compressing
-
Optimizing embedded images73%
-
-
JPG
receipt-scan.jpg4.8 MB · 3024 × 4032
✓Done
-
PNG
IMG_1837.png9.4 MB · 4096 × 2731
Queued
-
PDF
signed-agreement.pdf1.9 MB · 8 pages
✓Done
-
-
-
OutputEstimated reduction
-
PDF
brochure-compressed.pdf12.1 MB estimated
−51%
Writing output12.7 MB smaller
-
JPG
receipt-scan-small.jpg1.7 MB
−65%
Saved3.1 MB smaller
-
PNG
IMG_1837-small.png4.9 MB estimated
−48%
Queued4.5 MB smaller
-
PDF
signed-agreement-small.pdf1.2 MB
−37%
Saved0.7 MB smaller
-
-
- -
-
Compress recipe readyOutputs save to Downloads\Filesmith
-
Input40.9 MB
Estimated output19.9 MB
- -
-
-
-
- - diff --git a/docs/mockups/console/02-full-width-drawer.html b/docs/mockups/console/02-full-width-drawer.html deleted file mode 100644 index 0a06858..0000000 --- a/docs/mockups/console/02-full-width-drawer.html +++ /dev/null @@ -1,825 +0,0 @@ - - - - - - -Filesmith Console Drawer - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - -
-
- -
- 6 files, 1 selected - -
-
-
-
-
-
name
kind
size
result
status
-
-
-
-
6 files
177 MB
-
167 MB1.2 GBso far
-
3 of 6 done
-
-
-
- - - - - -
- - - - diff --git a/docs/mockups/console/03-inspector-tab.html b/docs/mockups/console/03-inspector-tab.html deleted file mode 100644 index ecdbcf9..0000000 --- a/docs/mockups/console/03-inspector-tab.html +++ /dev/null @@ -1,711 +0,0 @@ - - - - - -Console in the inspector - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
Filesmith
-
-
convert / images
-
- - - -
-
- -
- - -
-
- -
- 6 files, 1 selected - -
-
-
-
-
-
name
kind
size
result
status
-
-
-
6 files177 MB167 MB → 1.2 GB so far3 of 6 done
-
-
- - -
-
- - - - diff --git a/docs/mockups/console/04-command-bar.html b/docs/mockups/console/04-command-bar.html deleted file mode 100644 index d2c4015..0000000 --- a/docs/mockups/console/04-command-bar.html +++ /dev/null @@ -1,675 +0,0 @@ - - - - - -Command bar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Filesmith - - convert / images -
- - - -
-
- -
- - -
-
- -
- 6 files, 1 selected - -
-
- -
-
-
-
name
kind
size
result
status
-
-
-
-
-
6 files
-
-
177 MB
-
167 MB 1.2 GB so far
-
3 of 6 done
- -
-
- -
-
-
- console C:\Users\Max\Pictures\Trip - Runs on its own: jobs here never join the list or Completed - - -
-
-
-
-
- - - Tab complete Up history - history 2 of 5 -
- - - -
-
-
-
- - -
- - - - diff --git a/docs/mockups/console/index.html b/docs/mockups/console/index.html deleted file mode 100644 index 1830031..0000000 --- a/docs/mockups/console/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Console Mockups - - - -

Filesmith console

-

Four concepts for the limited in-app console: it runs filesmith commands only, typed without the prefix; anything else gets one calm line pointing to Open in terminal. Console jobs never join the queue or Completed; each finished run offers Show in File Explorer. Each screenshot opens the live mockup in that state: press Ctrl+` or click Console, then type (try convert *.heic --to webp, del *.*, Tab, Up/Down, Ctrl+C while running).

-

01 Bottom panel

A VS Code style panel under the files view; the inspector keeps full height. Console button in the toolbar, Stop sits red in the panel header while a run is going.

-

02 Full-width drawer

Slides up across files and inspector, about 40% of the height; opened from a Console item at the bottom of the sidebar, so it is reachable on every tab.

-

03 Inspector tab

A fourth inspector tab next to Options, Preview and Info; narrow log in the right column, the red Stop takes the place of the run button.

-

04 Command bar

A one-line filesmith prompt docked under the files list that grows upward into a log when a command runs or you press Up.

- - diff --git a/docs/mockups/console/shots/02-full-width-drawer-closed.png b/docs/mockups/console/shots/02-full-width-drawer-closed.png deleted file mode 100644 index 3d48416..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-closed.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-completion.png b/docs/mockups/console/shots/02-full-width-drawer-completion.png deleted file mode 100644 index 5d40ad9..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-completion.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-error.png b/docs/mockups/console/shots/02-full-width-drawer-error.png deleted file mode 100644 index 6576a8a..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-error.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-history.png b/docs/mockups/console/shots/02-full-width-drawer-history.png deleted file mode 100644 index 04d1889..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-history.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-open-idle.png b/docs/mockups/console/shots/02-full-width-drawer-open-idle.png deleted file mode 100644 index 9a229d1..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-open-idle.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-rejected.png b/docs/mockups/console/shots/02-full-width-drawer-rejected.png deleted file mode 100644 index 749aff2..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-rejected.png and /dev/null differ diff --git a/docs/mockups/console/shots/02-full-width-drawer-running.png b/docs/mockups/console/shots/02-full-width-drawer-running.png deleted file mode 100644 index 812a678..0000000 Binary files a/docs/mockups/console/shots/02-full-width-drawer-running.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-closed.png b/docs/mockups/console/shots/03-inspector-tab-closed.png deleted file mode 100644 index cb80dd7..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-closed.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-completion.png b/docs/mockups/console/shots/03-inspector-tab-completion.png deleted file mode 100644 index e647ba8..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-completion.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-error.png b/docs/mockups/console/shots/03-inspector-tab-error.png deleted file mode 100644 index a65e76f..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-error.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-history.png b/docs/mockups/console/shots/03-inspector-tab-history.png deleted file mode 100644 index f8546d9..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-history.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-open-idle.png b/docs/mockups/console/shots/03-inspector-tab-open-idle.png deleted file mode 100644 index 1eed741..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-open-idle.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-rejected.png b/docs/mockups/console/shots/03-inspector-tab-rejected.png deleted file mode 100644 index 71d3381..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-rejected.png and /dev/null differ diff --git a/docs/mockups/console/shots/03-inspector-tab-running.png b/docs/mockups/console/shots/03-inspector-tab-running.png deleted file mode 100644 index ce9310f..0000000 Binary files a/docs/mockups/console/shots/03-inspector-tab-running.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-closed.png b/docs/mockups/console/shots/04-command-bar-closed.png deleted file mode 100644 index 75158f2..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-closed.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-completion.png b/docs/mockups/console/shots/04-command-bar-completion.png deleted file mode 100644 index 490b849..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-completion.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-error.png b/docs/mockups/console/shots/04-command-bar-error.png deleted file mode 100644 index 4462bc0..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-error.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-history.png b/docs/mockups/console/shots/04-command-bar-history.png deleted file mode 100644 index b0ed857..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-history.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-open-idle.png b/docs/mockups/console/shots/04-command-bar-open-idle.png deleted file mode 100644 index 0c86e6b..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-open-idle.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-rejected.png b/docs/mockups/console/shots/04-command-bar-rejected.png deleted file mode 100644 index 7934e03..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-rejected.png and /dev/null differ diff --git a/docs/mockups/console/shots/04-command-bar-running.png b/docs/mockups/console/shots/04-command-bar-running.png deleted file mode 100644 index 19024d6..0000000 Binary files a/docs/mockups/console/shots/04-command-bar-running.png and /dev/null differ diff --git a/docs/mockups/console/shots/_index.png b/docs/mockups/console/shots/_index.png deleted file mode 100644 index 8cd5cbe..0000000 Binary files a/docs/mockups/console/shots/_index.png and /dev/null differ diff --git a/docs/mockups/icons/icon-sheet.html b/docs/mockups/icons/icon-sheet.html deleted file mode 100644 index fd8a2bd..0000000 --- a/docs/mockups/icons/icon-sheet.html +++ /dev/null @@ -1,16 +0,0 @@ -Icon set -

Icon set

-

Old at 18px on the left, then the new set at the sizes it is actually used at.

- - -
IconOld 18New 15New 18New 24New 40Tinted tileSolid tile
Convert
Compress
Resize
Image Upscale
Remove Background
Images
Video
Audio
PDF
Documents
Extract text
Mergenone
Splitnone
Burstnone
Extract imagesnone
\ No newline at end of file diff --git a/docs/mockups/terminal-v2/01-wind-plain.html b/docs/mockups/terminal-v2/01-wind-plain.html deleted file mode 100644 index 1dbc083..0000000 --- a/docs/mockups/terminal-v2/01-wind-plain.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - -Filesmith - - - -
- - Filesmith -
- - - -
-
- -
- - -
-

Convert

- - - -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- -
- Format -
- - - - -
- Quality -
-
- 80 -
-
- - -
-
- - diff --git a/docs/mockups/terminal-v2/02-wind-settings-card.html b/docs/mockups/terminal-v2/02-wind-settings-card.html deleted file mode 100644 index 4fd4009..0000000 --- a/docs/mockups/terminal-v2/02-wind-settings-card.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - -Filesmith - - - -
-
- - Filesmith -
-
- - - -
-
- -
- - -
-
-

Convert

- -
-
IMG_4821.HEICdone
-
screenshot.png62%
-
hero-banner.pngqueued
-
scan_0091.tiff✕ failed
- -
- -
-
- Format -
- -
- - - - -
-
-
-
- -
- - 80 -
-
-
- -
-
-
-
- - - - diff --git a/docs/mockups/terminal-v2/03-wind-no-rail.html b/docs/mockups/terminal-v2/03-wind-no-rail.html deleted file mode 100644 index b7b100b..0000000 --- a/docs/mockups/terminal-v2/03-wind-no-rail.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - -Filesmith, no rail - - - -
- - Filesmith -
- - - -
-
- - - -
-

Convert

- -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
-
+ drop files
- -
-
-
- - - - -
-
- - 80 -
-
-
- -
-
- - diff --git a/docs/mockups/terminal-v2/04-wind-icon-rail.html b/docs/mockups/terminal-v2/04-wind-icon-rail.html deleted file mode 100644 index c5e733e..0000000 --- a/docs/mockups/terminal-v2/04-wind-icon-rail.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - -Filesmith, icon rail - - - -
-
-
Filesmith
-
- - - -
-
- -
- - -
-

Convert

- -
-
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- -
-
Format
-
- - - - -
- -
-
Quality 80
-
- -
-
- - -
-
-
-
-
- - diff --git a/docs/mockups/terminal-v2/05-prompt-caret.html b/docs/mockups/terminal-v2/05-prompt-caret.html deleted file mode 100644 index 8f6fb25..0000000 --- a/docs/mockups/terminal-v2/05-prompt-caret.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - -Filesmith Prompt - - - -
- - Filesmith -
- - - -
-
- -
- - -
-
-

convert

- -
-
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- - -
- - - - -
- - -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/06-one-sentence.html b/docs/mockups/terminal-v2/06-one-sentence.html deleted file mode 100644 index 8ceb0a0..0000000 --- a/docs/mockups/terminal-v2/06-one-sentence.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -Filesmith One Sentence - - - -
-
- - Filesmith -
-
- - - -
-
- -
- - -
-
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
-

- convert 4 files to at - - - - - - - -

-
-
- - - - - diff --git a/docs/mockups/terminal-v2/07-verb-in-title.html b/docs/mockups/terminal-v2/07-verb-in-title.html deleted file mode 100644 index 80694eb..0000000 --- a/docs/mockups/terminal-v2/07-verb-in-title.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - -Filesmith - - - -
-
- - Filesmith -
-
- - - -
-
- -
-
- - -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- - -
-
- - - - -
- -
-
-
- - - diff --git a/docs/mockups/terminal-v2/08-verbs-at-bottom.html b/docs/mockups/terminal-v2/08-verbs-at-bottom.html deleted file mode 100644 index 99db75a..0000000 --- a/docs/mockups/terminal-v2/08-verbs-at-bottom.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - -Filesmith, verbs at the bottom - - - -
-
- - Filesmith -
- - - -
-
- -
-

Convert

- - - -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- -
- - - - -
- - -
- - -
- - diff --git a/docs/mockups/terminal-v2/09-one-batch-bar.html b/docs/mockups/terminal-v2/09-one-batch-bar.html deleted file mode 100644 index 8239441..0000000 --- a/docs/mockups/terminal-v2/09-one-batch-bar.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - -Filesmith - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
- - -
-
-

Convert

- - - -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.pngrunning
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
-
- -
- - - - -
- - -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/10-bracket-bar.html b/docs/mockups/terminal-v2/10-bracket-bar.html deleted file mode 100644 index e33d456..0000000 --- a/docs/mockups/terminal-v2/10-bracket-bar.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - -Filesmith Bracket Bar - - - -
- - filesmith -
- - - -
-
- -
- - -
-
-

convert

- -
    -
  1. IMG_4821.HEICdone
  2. -
  3. screenshot.png[######····]
  4. -
  5. hero-banner.pngqueued
  6. -
  7. scan_0091.tifffailed
  8. -
- -
- - - - -
- - -
-
-
- - diff --git a/docs/mockups/terminal-v2/11-glyph-gutter.html b/docs/mockups/terminal-v2/11-glyph-gutter.html deleted file mode 100644 index f7f2815..0000000 --- a/docs/mockups/terminal-v2/11-glyph-gutter.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -Filesmith Glyph Column - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
- - -
-

Convert

- -
    -
  • IMG_4821.HEIC
  • -
  • - - screenshot.png
  • -
  • hero-banner.png
  • -
  • scan_0091.tiff
  • -
  • -
- -
- - - - -
- - -
-
-
- - diff --git a/docs/mockups/terminal-v2/12-heavy-rule.html b/docs/mockups/terminal-v2/12-heavy-rule.html deleted file mode 100644 index cf885fc..0000000 --- a/docs/mockups/terminal-v2/12-heavy-rule.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - -Filesmith Heavy Rule - - - -
-
- - Filesmith -
- - - -
-
- -
-

- - - - - - - -

- - -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
- -
- - - - -
- - -
-
- - diff --git a/docs/mockups/terminal-v2/13-big-verb.html b/docs/mockups/terminal-v2/13-big-verb.html deleted file mode 100644 index ebca730..0000000 --- a/docs/mockups/terminal-v2/13-big-verb.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -Filesmith Big Verb - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
- - -
-

Convert

- -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tiff✕ failed
  • -
- -
-
- - - - -
- -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/14-two-halves.html b/docs/mockups/terminal-v2/14-two-halves.html deleted file mode 100644 index 1c2c2e1..0000000 --- a/docs/mockups/terminal-v2/14-two-halves.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - -Filesmith - - - -
- - Filesmith - -
- - - -
-
-
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
- -
- -
-
- - - - -
- -
-
- - diff --git a/docs/mockups/terminal-v2/15-key-value-grid.html b/docs/mockups/terminal-v2/15-key-value-grid.html deleted file mode 100644 index c2ea561..0000000 --- a/docs/mockups/terminal-v2/15-key-value-grid.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -Filesmith - - - -
- - Filesmith -
- - - -
-
- -
- - -
-

Convert

- -
- IMG_4821.HEIC done - screenshot.png 62% - hero-banner.png queued - scan_0091.tiff failed - - - - format -
- - - - -
- quality -
- -
-
-
-
- - - diff --git a/docs/mockups/terminal-v2/16-drop-frame.html b/docs/mockups/terminal-v2/16-drop-frame.html deleted file mode 100644 index e42d706..0000000 --- a/docs/mockups/terminal-v2/16-drop-frame.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - -Filesmith - - - -
- - Filesmith -
- - - -
-
- -
- - -
-

Convert

-
-
-
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
-
drop files or 
-
- -
-
- - - - -
- -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/17-inversion-only.html b/docs/mockups/terminal-v2/17-inversion-only.html deleted file mode 100644 index a5b90f2..0000000 --- a/docs/mockups/terminal-v2/17-inversion-only.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - -Filesmith – Inversion - - - -
-
- filesmith -
- - - -
-
- -
- - -
-
-

convert

- -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
- -
- - - - -
- - -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/18-right-rail.html b/docs/mockups/terminal-v2/18-right-rail.html deleted file mode 100644 index 54e04ce..0000000 --- a/docs/mockups/terminal-v2/18-right-rail.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - -Filesmith Right Rail - - - -
-
- - Filesmith -
- - - -
-
- -
-
-

Convert

- -
    -
  • IMG_4821.HEICdone
  • -
  • screenshot.png62%
  • -
  • hero-banner.pngqueued
  • -
  • scan_0091.tifffailed
  • -
- - -
- - - - -
- - -
- - -
-
- - diff --git a/docs/mockups/terminal-v2/19-one-number.html b/docs/mockups/terminal-v2/19-one-number.html deleted file mode 100644 index affb3ce..0000000 --- a/docs/mockups/terminal-v2/19-one-number.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - -Filesmith - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
- - -
-
    -
  • IMG_4821.HEIC
  • -
  • screenshot.png62%
  • -
  • hero-banner.png
  • -
  • scan_0091.tifffailed
  • -
- -
-
- - - - -
- -
-
-
-
- - diff --git a/docs/mockups/terminal-v2/20-empty-until-dropped.html b/docs/mockups/terminal-v2/20-empty-until-dropped.html deleted file mode 100644 index 256fdd1..0000000 --- a/docs/mockups/terminal-v2/20-empty-until-dropped.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Filesmith - - - -
- - Filesmith -
- - - -
-
- -
- - -
-
-
    -
  1. IMG_4821.HEICdone
  2. -
  3. screenshot.png62%
  4. -
  5. hero-banner.pngqueued
  6. -
  7. scan_0091.tifffailed
  8. -
- - - -
-
- - - - -
- -
-
-
-
- - - - diff --git a/docs/mockups/terminal-v2/index.html b/docs/mockups/terminal-v2/index.html deleted file mode 100644 index ffa5961..0000000 --- a/docs/mockups/terminal-v2/index.html +++ /dev/null @@ -1,40 +0,0 @@ -Terminal v2 mockups - -

Filesmith, terminal v2

20 monochrome directions, fewer things on screen. Click one to open it.

-
-Wind, plain
01Wind, plain

Wind's Settings shell with nothing extra added. A left rail, a title, four lines and one white pill. It looks like Wind's sibling app.

-Wind, settings card
02Wind, settings card

The queue and the options sit in Wind-style cards, so the convert page reads like a settings page.

-Wind, no rail
03Wind, no rail

Wind's tokens, but the rail is removed. The verbs become a quiet word row under the title bar, which frees the whole width for black space.

-Wind, icon rail
04Wind, icon rail

The closest to a shipping desktop app: a Wind rail with small 1.5px icons beside each verb, and the content kept very sparse.

-Prompt
05Prompt

The title is a prompt: '› convert_' with a slow blinking underscore. That one device carries the terminal feel.

-One sentence
06One sentence

The options read as one line: 'convert 4 files to webp at 80'. The underlined words are the controls.

-Verb in the title
07Verb in the title

No rail at all. The title 'Convert ⌄' is the navigation, and clicking it drops the 7 verbs.

-Verbs at the bottom
08Verbs at the bottom

The work sits at the top of the window and the 7 verbs rest along the bottom edge like a quiet dock line.

-One bar
09One bar

The rows show only a word each. Progress for the whole batch is one 1px white line under the queue.

-Bracket bar
10Bracket bar

Only the running file shows a text bar, '[######····]'. That bracketed bar is the only typographic device.

-Glyph column
11Glyph column

Status is a single glyph in a left gutter, '✓ ○ · ✕', so the right side of every row stays empty.

-One heavy rule
12One heavy rule

A single 2px white rule under the title is the only line on screen. Everything else floats.

-Big verb
13Big verb

The verb is the hero: 'Convert' set at 88px light in the top-left. The rest is small and quiet.

-Two halves
14Two halves

Files on the left half and the decision on the right. Each half has one job, separated by black space only.

-Key and value
15Key and value

Everything is a two-column mono list: names with statuses, and settings with values, all on one alignment line.

-Drop frame
16Drop frame

The queue lives inside a large dashed region. The drop target and the list are the same object.

-Inversion
17Inversion

Inversion is the only emphasis anywhere: the active verb, the chosen format and the failed word are small black-on-light blocks. No pills, no lines, no bold.

-Right rail
18Right rail

Content first: the work starts at the left edge and the verbs sit in a thin right-hand list.

-One number
19One number

Rows carry only names, dimmed when done. A single large '62%' beside the running row is the one live number on screen.

-Nothing until dropped
20Nothing until dropped

The resting screen is almost blank: the verb list and one centred line 'drop files'. The queue, format and button appear only once files arrive.

-
\ No newline at end of file diff --git a/docs/mockups/terminal-v2/shots/01-wind-plain.png b/docs/mockups/terminal-v2/shots/01-wind-plain.png deleted file mode 100644 index 259f861..0000000 Binary files a/docs/mockups/terminal-v2/shots/01-wind-plain.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/02-wind-settings-card.png b/docs/mockups/terminal-v2/shots/02-wind-settings-card.png deleted file mode 100644 index 23480d5..0000000 Binary files a/docs/mockups/terminal-v2/shots/02-wind-settings-card.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/03-wind-no-rail.png b/docs/mockups/terminal-v2/shots/03-wind-no-rail.png deleted file mode 100644 index 2bd04a9..0000000 Binary files a/docs/mockups/terminal-v2/shots/03-wind-no-rail.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/04-wind-icon-rail.png b/docs/mockups/terminal-v2/shots/04-wind-icon-rail.png deleted file mode 100644 index bb391ed..0000000 Binary files a/docs/mockups/terminal-v2/shots/04-wind-icon-rail.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/05-prompt-caret.png b/docs/mockups/terminal-v2/shots/05-prompt-caret.png deleted file mode 100644 index f790014..0000000 Binary files a/docs/mockups/terminal-v2/shots/05-prompt-caret.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/06-one-sentence.png b/docs/mockups/terminal-v2/shots/06-one-sentence.png deleted file mode 100644 index b9293ca..0000000 Binary files a/docs/mockups/terminal-v2/shots/06-one-sentence.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/07-verb-in-title.png b/docs/mockups/terminal-v2/shots/07-verb-in-title.png deleted file mode 100644 index f5d5821..0000000 Binary files a/docs/mockups/terminal-v2/shots/07-verb-in-title.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/08-verbs-at-bottom.png b/docs/mockups/terminal-v2/shots/08-verbs-at-bottom.png deleted file mode 100644 index 169ad09..0000000 Binary files a/docs/mockups/terminal-v2/shots/08-verbs-at-bottom.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/09-one-batch-bar.png b/docs/mockups/terminal-v2/shots/09-one-batch-bar.png deleted file mode 100644 index f191ab7..0000000 Binary files a/docs/mockups/terminal-v2/shots/09-one-batch-bar.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/10-bracket-bar.png b/docs/mockups/terminal-v2/shots/10-bracket-bar.png deleted file mode 100644 index e656b2f..0000000 Binary files a/docs/mockups/terminal-v2/shots/10-bracket-bar.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/11-glyph-gutter.png b/docs/mockups/terminal-v2/shots/11-glyph-gutter.png deleted file mode 100644 index 0842e47..0000000 Binary files a/docs/mockups/terminal-v2/shots/11-glyph-gutter.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/12-heavy-rule.png b/docs/mockups/terminal-v2/shots/12-heavy-rule.png deleted file mode 100644 index 45ec198..0000000 Binary files a/docs/mockups/terminal-v2/shots/12-heavy-rule.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/13-big-verb.png b/docs/mockups/terminal-v2/shots/13-big-verb.png deleted file mode 100644 index 6687901..0000000 Binary files a/docs/mockups/terminal-v2/shots/13-big-verb.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/14-two-halves.png b/docs/mockups/terminal-v2/shots/14-two-halves.png deleted file mode 100644 index 17c8be1..0000000 Binary files a/docs/mockups/terminal-v2/shots/14-two-halves.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/15-key-value-grid.png b/docs/mockups/terminal-v2/shots/15-key-value-grid.png deleted file mode 100644 index 2c08f89..0000000 Binary files a/docs/mockups/terminal-v2/shots/15-key-value-grid.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/16-drop-frame.png b/docs/mockups/terminal-v2/shots/16-drop-frame.png deleted file mode 100644 index e37febf..0000000 Binary files a/docs/mockups/terminal-v2/shots/16-drop-frame.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/17-inversion-only.png b/docs/mockups/terminal-v2/shots/17-inversion-only.png deleted file mode 100644 index 508a88d..0000000 Binary files a/docs/mockups/terminal-v2/shots/17-inversion-only.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/18-right-rail.png b/docs/mockups/terminal-v2/shots/18-right-rail.png deleted file mode 100644 index 09dda9c..0000000 Binary files a/docs/mockups/terminal-v2/shots/18-right-rail.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/19-one-number.png b/docs/mockups/terminal-v2/shots/19-one-number.png deleted file mode 100644 index d116322..0000000 Binary files a/docs/mockups/terminal-v2/shots/19-one-number.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/20-empty-until-dropped.png b/docs/mockups/terminal-v2/shots/20-empty-until-dropped.png deleted file mode 100644 index 786ef43..0000000 Binary files a/docs/mockups/terminal-v2/shots/20-empty-until-dropped.png and /dev/null differ diff --git a/docs/mockups/terminal-v2/shots/_index.png b/docs/mockups/terminal-v2/shots/_index.png deleted file mode 100644 index aa9e65e..0000000 Binary files a/docs/mockups/terminal-v2/shots/_index.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/01-wind-classic.html b/docs/mockups/terminal-v3/01-wind-classic.html deleted file mode 100644 index 66490f3..0000000 --- a/docs/mockups/terminal-v3/01-wind-classic.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - -Filesmith Wind Classic - - - -
-
- -
Filesmith
-
- - - -
-
- -
- - -
-
-
-

Convert

Change images to another format.

-
- 6 files - -
-
- -
-
-
Queue2 of 6 done
-
-
-
-
IMG_4821.HEIC3.2 MB
-
640 KB
-
- - -
-
-
-
-
product-shot.jpg2.1 MB
-
486 KB
-
- - -
-
-
-
-
screenshot-2026-10-03.png1.8 MB
-
62%
-
- -
-
-
-
-
hero-banner@2x.png4.6 MB
-
queued
-
- -
-
-
-
-
scan_0091.tiff22.4 MB
-
Unsupported compression
-
- - -
-
-
-
-
logo-final.bmp1.1 MB
-
queued
-
- -
-
-
- -
- -
-
Options
-
-
-
Format.webp
-
- - - - - - -
-
-
-
Quality
-
- - - -
-
-
-
Output
-
- - -
-
-
-
Keep metadataCamera info and color profile
- -
-
- -
-
- -
- Converting - 1 failed -
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/02-wind-stacked.html b/docs/mockups/terminal-v3/02-wind-stacked.html deleted file mode 100644 index 6f85a92..0000000 --- a/docs/mockups/terminal-v3/02-wind-stacked.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - -Filesmith Wind Stacked - - - -
-
- - Filesmith -
- - - -
-
- -
- - -
-
-
- -
-

Convert

-

Change images to another format.

-
-
- 6 files - -
-
-
- -
-
Queue1 failed
-
-
- -
IMG_4821.HEIC3.2 MB
-
640 KB
-
- - -
-
-
- -
product-shot.jpg2.1 MB
-
486 KB
-
- - -
-
-
- -
screenshot-2026-10-03.png1.8 MB
-
62%
-
- -
-
-
- -
hero-banner@2x.png4.6 MB
-
queued
-
- -
-
-
- -
scan_0091.tiff22.4 MB
-
Unsupported compression
-
- - -
-
-
- -
logo-final.bmp1.1 MB
-
queued
-
- -
-
-
- -
Options.webp
-
-
-
FormatWebP, small and widely supported
-
- - - - - - -
-
-
-
QualityBalanced, sharp at a fraction of the size
-
- - - -
-
-
-
OutputWhere converted files are saved
-
- - -
-
-
-
Keep metadataCamera data, dates and color profile
- -
-
-
- -
-
- 2 of 6 done - -
-
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/03-wind-tiled-nav.html b/docs/mockups/terminal-v3/03-wind-tiled-nav.html deleted file mode 100644 index 61e8d80..0000000 --- a/docs/mockups/terminal-v3/03-wind-tiled-nav.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - -Filesmith, Wind Tiled Nav - - - - - -
-
- - Filesmith - convert -
- - - -
-
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files - -
- -
-
-

Queue

2 of 6 done
-
    -
  • - -
    IMG_4821.HEIC
    3.2 MB
    -
    640 KB
    -
    -
  • -
  • - -
    product-shot.jpg
    2.1 MB
    -
    486 KB
    -
    -
  • -
  • - -
    screenshot-2026-10-03.png
    1.8 MB
    -
    62%
    -
    -
  • -
  • - -
    hero-banner@2x.png
    4.6 MB
    -
    queued
    -
    -
  • -
  • - -
    scan_0091.tiff
    22.4 MB
    -
    Unsupported compression
    -
    -
  • -
  • - -
    logo-final.bmp
    1.1 MB
    -
    queued
    -
    -
  • -
- -
- - -
- -
- Converting - 1 failed -
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/04-wind-grouped-rail.html b/docs/mockups/terminal-v3/04-wind-grouped-rail.html deleted file mode 100644 index 4370f4c..0000000 --- a/docs/mockups/terminal-v3/04-wind-grouped-rail.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - -Filesmith, Wind Grouped Rail - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files - -
- -
- -
-
Queue2 of 6 done
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
-
-
Drop more files here
-
-
- - -
-
Format.webp
-
-
- - -
-
- -
-
Quality and output
-
-
Quality
-
-
-
Save to
- - -
- -
-
Metadata
-
-
Keep metadataCamera info and color profile
- -
- -
- -
-
- -
- Converting - 1 failed -
-
-
-
- - diff --git a/docs/mockups/terminal-v3/05-wind-command-header.html b/docs/mockups/terminal-v3/05-wind-command-header.html deleted file mode 100644 index a443521..0000000 --- a/docs/mockups/terminal-v3/05-wind-command-header.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -Filesmith – Wind Command Header - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Filesmith - -
- - - -
-
- -
- - -
-
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6files - - -
-
-
- 2 of 6 done -
- 44% -
-
- -
-
-
Queue1 failed
-
-
-
-
IMG_4821.HEIC
-
3.2 MB→640 KB
-
-
-
-
-
product-shot.jpg
-
2.1 MB→486 KB
-
-
-
-
-
screenshot-2026-10-03.png1.8 MB
-
62%
-
-
-
-
-
hero-banner@2x.png4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff22.4 MB
-
Unsupported compression
-
-
-
-
-
logo-final.bmp1.1 MB
-
queued
-
-
- -
-
- - -
-
-
- -
- Converting - Saved next to source -
-
- - diff --git a/docs/mockups/terminal-v3/06-linear-inspector.html b/docs/mockups/terminal-v3/06-linear-inspector.html deleted file mode 100644 index c580164..0000000 --- a/docs/mockups/terminal-v3/06-linear-inspector.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - -Filesmith Linear Inspector - - - - - - - - -
-
-
- - Filesmith -
-
-
- - - -
-
- -
- - - - -
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6 files - -
-
- -
NameSizeStatus
- -
-
- - IMG_4821.HEIC - 3.2 MB - 640 KB - -
-
- - product-shot.jpg - 2.1 MB - 486 KB - -
-
- - screenshot-2026-10-03.png - 1.8 MB - 62% - -
-
- - hero-banner@2x.png - 4.6 MB - queued - -
-
- - scan_0091.tiff - 22.4 MB - Unsupported compression - -
-
- - logo-final.bmp - 1.1 MB - queued - -
-
- - - -
- Converting - 1 failed -
-
- - - -
-
- - - diff --git a/docs/mockups/terminal-v3/07-raycast-panel.html b/docs/mockups/terminal-v3/07-raycast-panel.html deleted file mode 100644 index ebe461e..0000000 --- a/docs/mockups/terminal-v3/07-raycast-panel.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - -Filesmith Raycast Panel - - - - - - - -
-
-
- - Filesmith -
-
- - - -
-
- -
-
- - -
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6 files - -
-
- -
-
-
Queue1 failed
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
-
3.2 MB → 640 KB
-
-
-
-
-
-
product-shot.jpg
2.1 MB
-
-
2.1 MB → 486 KB
-
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
-
62%
-
-
-
-
-
-
hero-banner@2x.png
4.6 MB
-
-
queued
-
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
-
Unsupported compression
-
-
-
-
-
logo-final.bmp
1.1 MB
-
-
queued
-
-
-
-
- -
- - -
- -
-
- - 2 of 6 done -
-
- - - -
-
-
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/08-zed-activity-bar.html b/docs/mockups/terminal-v3/08-zed-activity-bar.html deleted file mode 100644 index dd2469a..0000000 --- a/docs/mockups/terminal-v3/08-zed-activity-bar.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - -Filesmith 08 Zed Activity Bar - - - - - - - - -
-
- -
Filesmith
-
convert
-
- - - -
-
- -
- - -
-
-
-

Convert

-
Change images to another format.
-
- 6 files - -
-
- -
-
-
Queue2 of 6 done
-
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB -
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB -
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62% -
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued -
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression -
-
-
-
-
logo-final.bmp
1.1 MB
-
queued -
-
-
- -
- 35.2 MB total - -
-
-
- - -
-
-
- -
- Converting 1 file - 1 failed -
-
- - - diff --git a/docs/mockups/terminal-v3/09-top-icon-tabs.html b/docs/mockups/terminal-v3/09-top-icon-tabs.html deleted file mode 100644 index c651a3b..0000000 --- a/docs/mockups/terminal-v3/09-top-icon-tabs.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -Filesmith Top Tabs - - - -
- -
- - Filesmith - - - - -
- - - -
-
-
-

Convert

Change images to another format.

- - 6 files - -
- -
- -
-
Queue2 of 6 done
-
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
-
-
- -
-
- - - -
- -
- Converting 1 file - 1 failed -
-
-
- - - diff --git a/docs/mockups/terminal-v3/10-segmented-switcher.html b/docs/mockups/terminal-v3/10-segmented-switcher.html deleted file mode 100644 index c61e961..0000000 --- a/docs/mockups/terminal-v3/10-segmented-switcher.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - -Filesmith, Segmented Switcher - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Filesmith - - - - -
- - - -
-
-
-
-
-

Convert

-

Change images to another format.

-
- - 6 files - -
-
-
- -
-
-
Queue2 of 6 done
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
- 3.2 MB →640 KB -
-
-
-
-
-
product-shot.jpg
2.1 MB
-
- 2.1 MB →486 KB -
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
- 62% -
-
-
-
-
hero-banner@2x.png
4.6 MB
-
- queued -
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
- Unsupported compression - -
-
-
-
-
logo-final.bmp
1.1 MB
-
- queued -
-
-
-
Drop more files here
-
-
- - -
-
-
- -
- Converting 1 file - 1 failed -
-
- - diff --git a/docs/mockups/terminal-v3/11-bottom-dock.html b/docs/mockups/terminal-v3/11-bottom-dock.html deleted file mode 100644 index 6c3d778..0000000 --- a/docs/mockups/terminal-v3/11-bottom-dock.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - -Filesmith - Bottom Dock - - - -
- -
- -
Filesmith
-
convert
-
- - - -
-
- -
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6 files - -
-
- -
-
- - -
-
Queue2 of 6 done
-
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
- - -
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
- - -
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
- -
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
- -
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
- - -
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
- -
-
-
- -
-
- - - - -
-
- - -
- -
- -
- - diff --git a/docs/mockups/terminal-v3/12-thumb-grid.html b/docs/mockups/terminal-v3/12-thumb-grid.html deleted file mode 100644 index 7a5f4bb..0000000 --- a/docs/mockups/terminal-v3/12-thumb-grid.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - -Filesmith, Thumbnail Grid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
Filesmith
-
convert
- - - -
- -
- - -
-
-
-

Convert

Change images to another format.

- 6 files - -
- -
-
-
Queue2 of 6 done
-
-
-
HEIC -
-
-
IMG_4821.HEIC
3.2 MB
-
Done640 KB
-
- -
-
JPG -
-
-
product-shot.jpg
2.1 MB
-
Done486 KB
-
- -
-
PNG
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
- -
-
PNG
-
-
-
hero-banner@2x.png
4.6 MB
-
Queued
-
- -
-
TIFF
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
- -
-
BMP
-
-
-
logo-final.bmp
1.1 MB
-
Queued
-
-
- -
- - -
-
-
- -
- Converting - 1 failed -
-
- - diff --git a/docs/mockups/terminal-v3/13-quiet-table.html b/docs/mockups/terminal-v3/13-quiet-table.html deleted file mode 100644 index b4e1e11..0000000 --- a/docs/mockups/terminal-v3/13-quiet-table.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -Filesmith Quiet Table - - - - - - - - -
-
- - Filesmith - - - - -
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- - 6 files - -
- -
-
-
Queue2 of 6 done
-
-
- Name - Size - Result - Status - -
- -
-
IMG_4821.HEIC
- 3.2 MB - 640 KB - Done -
-
- -
-
product-shot.jpg
- 2.1 MB - 486 KB - Done -
-
- -
-
screenshot-2026-10-03.png
- 1.8 MB - – - 62% -
-
- -
-
hero-banner@2x.png
- 4.6 MB - – - Queued -
-
- -
-
scan_0091.tiff
- 22.4 MB - – - Unsupported compression -
-
- -
-
logo-final.bmp
- 1.1 MB - – - Queued -
-
- - -
-
- -
-
Options
-
-
-
Format.webp
-
- - - - - - -
-
-
-
Quality
-
- - - -
-
-
-
Output
-
- - -
-
-
-
Keep metadata
Dates, camera and color profile
- -
-
- -
-
-
-
- -
- Converting 1 file - 1 failed -
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/14-prompt-title.html b/docs/mockups/terminal-v3/14-prompt-title.html deleted file mode 100644 index c72844f..0000000 --- a/docs/mockups/terminal-v3/14-prompt-title.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - -Filesmith Prompt Title - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Filesmith - convert -
- - - -
-
- -
- - -
-
-
-
-

>convert

-

Change images to another format.

-
-
- 6 files - -
-
-
- -
-
-
#queue2 of 6 done
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
-
-
- -
- -
-
#options
-
-
-
format.webp
-
- - -
-
-
-
quality
-
-
-
-
output
-
- - -
-
-
-
metadata
Keep EXIF, colour profile, dates
- -
-
- -
-
- -
- Converting 1 file - 1 failed -
-
-
-
- - diff --git a/docs/mockups/terminal-v3/15-glyph-gutter.html b/docs/mockups/terminal-v3/15-glyph-gutter.html deleted file mode 100644 index fa8bafd..0000000 --- a/docs/mockups/terminal-v3/15-glyph-gutter.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - -Filesmith – Glyph Gutter - - - -
- -
- -
Filesmith
-
convert
-
- - - -
-
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6 files - -
- -
- -
-
Queue2 of 6 done
-
- -
-
-
-
IMG_4821.HEIC
3.2 MB
-
done640 KB
-
-
- -
-
-
-
product-shot.jpg
2.1 MB
-
done486 KB
-
-
- -
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
-
- -
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
-
- -
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
-
- -
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
-
- -
-
-
Drop more files here
-
-
-
- - - -
- -
- Converting - 1 failed -
-
-
-
- - - diff --git a/docs/mockups/terminal-v3/16-drop-frame.html b/docs/mockups/terminal-v3/16-drop-frame.html deleted file mode 100644 index ce09a9e..0000000 --- a/docs/mockups/terminal-v3/16-drop-frame.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - -Filesmith Drop Frame - - - -
- -
- - Filesmith - convert -
- - - -
-
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
-
- 6 files - -
-
- -
-
-
Queue2 of 6 done
-
- - -
- -
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
- - -
-
- -
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
- - -
-
- -
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
- -
-
- -
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
- -
-
- -
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
- - -
-
- -
-
-
logo-final.bmp
1.1 MB
-
queued
-
- -
-
- -
- -
-
- -
-
Options
-
-
-
Format.webp
-
- - -
-
-
-
Quality
-
-
-
-
Output
-
- - -
-
-
-
Keep metadata
Dates, camera and location
- -
-
- -
-
-
-
- -
- Converting - 1 failed -
-
-
-
- - diff --git a/docs/mockups/terminal-v3/17-preview-column.html b/docs/mockups/terminal-v3/17-preview-column.html deleted file mode 100644 index c82cf73..0000000 --- a/docs/mockups/terminal-v3/17-preview-column.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - -Filesmith – Preview Column - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
Filesmith
-
convert
-
- - - -
-
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files - -
- -
-
-
Queue2 of 6 done
-
-
-
-
IMG_4821.HEIC3.2 MB
-
3.2 MB640 KB
-
-
-
-
-
product-shot.jpg2.1 MB
-
2.1 MB486 KB
-
-
-
-
-
screenshot-2026-10-03.png1.8 MB
-
62%
-
-
-
-
-
hero-banner@2x.png4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff22.4 MB
-
Unsupported compression
-
-
-
-
-
logo-final.bmp1.1 MB
-
queued
-
-
- -
-
- -
-
Preview.webp
-
-
- - - - - - - - - - - hero-banner@2x.png - 2880 × 1200 -
-
- 4.6 MB~920 KB - -80% -
- -
-
Format
-
- - -
-
- -
-
Quality
-
-
- -
-
Output
-
-
- -
-
Keep metadata
- -
- - -
-
-
- -
- Converting - 1 failed -
-
-
-
- - diff --git a/docs/mockups/terminal-v3/18-ruled-sheet.html b/docs/mockups/terminal-v3/18-ruled-sheet.html deleted file mode 100644 index 8248149..0000000 --- a/docs/mockups/terminal-v3/18-ruled-sheet.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - -Filesmith Ruled Sheet - - - - - - - - -
-
- -
Filesmith
-
convert
- - - -
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files - -
- -
-
-
Queue2 of 6 done
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
-
-
- -
- - -
-
-
- -
- Converting 1 file - 1 failed -
-
- - - diff --git a/docs/mockups/terminal-v3/19-verb-sentence.html b/docs/mockups/terminal-v3/19-verb-sentence.html deleted file mode 100644 index 71db577..0000000 --- a/docs/mockups/terminal-v3/19-verb-sentence.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - -Filesmith Verb Sentence - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Filesmith - convert - - - -
- -
- - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files -
- -
-
-
- Convert 6 files to , , . -
-
-
- - -
-
- -
-
-

Queue

- - 2 of 6 done - -
- -
-
- IMG_4821.HEIC - 3.2 MB - 640 KB webp - -
-
-
- product-shot.jpg - 2.1 MB - 486 KB webp - -
-
-
- screenshot-2026-10-03.png - 1.8 MB - 62% - -
-
-
- hero-banner@2x.png - 4.6 MB - queued - -
-
-
- scan_0091.tiff - 22.4 MB - Unsupported compression - -
-
-
- logo-final.bmp - 1.1 MB - queued - -
-
Drop more files here
-
- -
- Converting 1 file - 1 failed -
-
-
-
-
- - diff --git a/docs/mockups/terminal-v3/20-toolbar-strip.html b/docs/mockups/terminal-v3/20-toolbar-strip.html deleted file mode 100644 index 1a1895b..0000000 --- a/docs/mockups/terminal-v3/20-toolbar-strip.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - -Filesmith Toolbar Strip - - - -
- - -
- - Filesmith - convert - - - -
- -
- - - - -
-
-
-
-

Convert

-

Change images to another format.

-
- 6 files - -
- -
- - - - -

Queue

2 of 6 done
-
-
-
-
IMG_4821.HEIC
3.2 MB
-
640 KB
-
- - -
-
-
-
-
product-shot.jpg
2.1 MB
-
486 KB
-
- - -
-
-
-
-
screenshot-2026-10-03.png
1.8 MB
-
62%
-
- -
-
-
-
-
hero-banner@2x.png
4.6 MB
-
queued
-
- -
-
-
-
-
scan_0091.tiff
22.4 MB
-
Unsupported compression
-
- - -
-
-
-
-
logo-final.bmp
1.1 MB
-
queued
-
- -
-
- -
-
- -
- Converting - 1 failed -
-
-
-
- - diff --git a/docs/mockups/terminal-v3/index.html b/docs/mockups/terminal-v3/index.html deleted file mode 100644 index 53b28e4..0000000 --- a/docs/mockups/terminal-v3/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - -Filesmith mockups, round 3 - -

Filesmith, terminal round 3

20 directions with icons and more substance. Click a card to open the full mockup.

-
-Wind Classic mockup
01Wind Classic

Filesmith as a sibling of Wind Settings: same rail, same header band, same cards. The queue sits in the middle and the options on the right, with nothing left over.

-Wind Stacked Rows mockup
02Wind Stacked Rows

Wind's single-column settings rhythm: a queue card, then an options card made of real Wind rows, and the floating Save pill that becomes Convert.

-Wind Tiled Nav mockup
03Wind Tiled Nav

Wind with a little more presence in the rail: every verb icon lives in its own small tile, so the nav reads as a set of tools, not a list of words.

-Wind Grouped Rail mockup
04Wind Grouped Rail

Wind Settings structure, with the rail grouped like Wind's bottom group: Image, AI and More sections make 7 verbs feel organised, not long.

-Wind Command Header mockup
05Wind Command Header

Wind's layout, but the header band does the heavy lifting: the title, the file count, Add files and the Convert button all live in one confident band, which leaves the body for the queue and a slim options card.

-Linear Inspector mockup
06Linear Inspector

Linear's calm list plus a single quiet inspector: the queue is a borderless list with hairlines, and the options live in a full-height right pane separated by one line.

-Raycast Panel mockup
07Raycast Panel

The whole app as one Raycast-like floating panel on black: verb tabs along the top, a list in the middle, and an action bar at the bottom.

-Zed Activity Bar mockup
08Zed Activity Bar

An editor-like activity bar: a narrow column of stacked icon-plus-label buttons, which frees width for a wide queue and a generous options column.

-Top Icon Tabs mockup
09Top Icon Tabs

No sidebar at all: the verbs become a row of icon-and-label tabs under the titlebar, so the content gets the full 1440px width.

-Segmented Switcher mockup
10Segmented Switcher

The verbs live in one segmented control, like a mode switch on a pro camera: a single object that says this app does seven things.

-Bottom Dock mockup
11Bottom Dock

The verbs sit in a quiet dock at the bottom, like a tool tray, so the top of the window belongs entirely to the job at hand.

-Thumbnail Grid mockup
12Thumbnail Grid

Files as visual cards, not lines: a 3x2 grid of thumbnails where each card shows its own status, which feels more like a media tool.

-Quiet Table mockup
13Quiet Table

The queue as a proper table with four light column headers, for people who like to scan by column: name, size, result, status.

-Prompt Title mockup
14Prompt Title

Round 2's prompt-caret idea with real substance: the page title reads like a command, but the screen around it is a complete, carded app.

-Glyph Gutter mockup
15Glyph Gutter

Status first: every queue row starts with a status glyph in its own gutter, so the column of checks, a ring and a triangle tells the story before you read a name.

-Drop Frame mockup
16Drop Frame

The queue lives inside a visible drop frame: the dashed boundary says 'drop here' all the time, so the empty-state idea becomes the structure.

-Preview Column mockup
17Preview Column

A media tool should show the picture: the right column opens with a greyscale preview of the selected file and its expected result, then the options, so you see what you are about to make.

-Ruled Sheet mockup
18Ruled Sheet

Typography-led with real weight: one 2px white rule under the header carries the structure, and the queue and options sit on a single ruled sheet with clear sections, not floating cards.

-Verb Sentence mockup
19Verb Sentence

The header is a sentence you can edit: 'Convert 6 files to WebP, Balanced, next to source', where each grey word is a select that sets that option, so the sentence is the options panel.

-Toolbar Strip mockup
20Toolbar Strip

All options in one toolbar strip above the queue, like an image editor's options bar, so the queue gets the full width and plenty of room.

-
diff --git a/docs/mockups/terminal-v3/shots/01-wind-classic.png b/docs/mockups/terminal-v3/shots/01-wind-classic.png deleted file mode 100644 index 636116f..0000000 Binary files a/docs/mockups/terminal-v3/shots/01-wind-classic.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/02-wind-stacked.png b/docs/mockups/terminal-v3/shots/02-wind-stacked.png deleted file mode 100644 index a60d605..0000000 Binary files a/docs/mockups/terminal-v3/shots/02-wind-stacked.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/03-wind-tiled-nav.png b/docs/mockups/terminal-v3/shots/03-wind-tiled-nav.png deleted file mode 100644 index b032f5c..0000000 Binary files a/docs/mockups/terminal-v3/shots/03-wind-tiled-nav.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/04-wind-grouped-rail.png b/docs/mockups/terminal-v3/shots/04-wind-grouped-rail.png deleted file mode 100644 index e43a0e0..0000000 Binary files a/docs/mockups/terminal-v3/shots/04-wind-grouped-rail.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/05-wind-command-header.png b/docs/mockups/terminal-v3/shots/05-wind-command-header.png deleted file mode 100644 index 68f36e8..0000000 Binary files a/docs/mockups/terminal-v3/shots/05-wind-command-header.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/06-linear-inspector.png b/docs/mockups/terminal-v3/shots/06-linear-inspector.png deleted file mode 100644 index f6ed282..0000000 Binary files a/docs/mockups/terminal-v3/shots/06-linear-inspector.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/07-raycast-panel.png b/docs/mockups/terminal-v3/shots/07-raycast-panel.png deleted file mode 100644 index 9e3a879..0000000 Binary files a/docs/mockups/terminal-v3/shots/07-raycast-panel.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/08-zed-activity-bar.png b/docs/mockups/terminal-v3/shots/08-zed-activity-bar.png deleted file mode 100644 index 7382790..0000000 Binary files a/docs/mockups/terminal-v3/shots/08-zed-activity-bar.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/09-top-icon-tabs.png b/docs/mockups/terminal-v3/shots/09-top-icon-tabs.png deleted file mode 100644 index 2fb254c..0000000 Binary files a/docs/mockups/terminal-v3/shots/09-top-icon-tabs.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/10-segmented-switcher.png b/docs/mockups/terminal-v3/shots/10-segmented-switcher.png deleted file mode 100644 index 5c2cec6..0000000 Binary files a/docs/mockups/terminal-v3/shots/10-segmented-switcher.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/11-bottom-dock.png b/docs/mockups/terminal-v3/shots/11-bottom-dock.png deleted file mode 100644 index dd84058..0000000 Binary files a/docs/mockups/terminal-v3/shots/11-bottom-dock.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/12-thumb-grid.png b/docs/mockups/terminal-v3/shots/12-thumb-grid.png deleted file mode 100644 index b230b54..0000000 Binary files a/docs/mockups/terminal-v3/shots/12-thumb-grid.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/13-quiet-table.png b/docs/mockups/terminal-v3/shots/13-quiet-table.png deleted file mode 100644 index 43df70a..0000000 Binary files a/docs/mockups/terminal-v3/shots/13-quiet-table.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/14-prompt-title.png b/docs/mockups/terminal-v3/shots/14-prompt-title.png deleted file mode 100644 index f76933b..0000000 Binary files a/docs/mockups/terminal-v3/shots/14-prompt-title.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/15-glyph-gutter.png b/docs/mockups/terminal-v3/shots/15-glyph-gutter.png deleted file mode 100644 index bef99f6..0000000 Binary files a/docs/mockups/terminal-v3/shots/15-glyph-gutter.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/16-drop-frame.png b/docs/mockups/terminal-v3/shots/16-drop-frame.png deleted file mode 100644 index 675e13a..0000000 Binary files a/docs/mockups/terminal-v3/shots/16-drop-frame.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/17-preview-column.png b/docs/mockups/terminal-v3/shots/17-preview-column.png deleted file mode 100644 index 811a502..0000000 Binary files a/docs/mockups/terminal-v3/shots/17-preview-column.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/18-ruled-sheet.png b/docs/mockups/terminal-v3/shots/18-ruled-sheet.png deleted file mode 100644 index ff4cbc9..0000000 Binary files a/docs/mockups/terminal-v3/shots/18-ruled-sheet.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/19-verb-sentence.png b/docs/mockups/terminal-v3/shots/19-verb-sentence.png deleted file mode 100644 index b1a0552..0000000 Binary files a/docs/mockups/terminal-v3/shots/19-verb-sentence.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/20-toolbar-strip.png b/docs/mockups/terminal-v3/shots/20-toolbar-strip.png deleted file mode 100644 index e43e809..0000000 Binary files a/docs/mockups/terminal-v3/shots/20-toolbar-strip.png and /dev/null differ diff --git a/docs/mockups/terminal-v3/shots/_index.png b/docs/mockups/terminal-v3/shots/_index.png deleted file mode 100644 index 8e9f3d2..0000000 Binary files a/docs/mockups/terminal-v3/shots/_index.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/01-activity-explorer.html b/docs/mockups/terminal-v4/01-activity-explorer.html deleted file mode 100644 index 718bda9..0000000 --- a/docs/mockups/terminal-v4/01-activity-explorer.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - -Filesmith Explorer - - - - - -
- -
-
- - - Filesmith -
-
- - - -
- -
- - - - - - - -
-
-
- screenshot-2026-10-03.png - -
-
- - - - -
-
- - -
-
- -
-
PNGWebP -
-
-
Dimensions
2880 × 1800
-
Format
PNGWebP
-
Size
1.8 MB~410 KB
-
Progress
62%
-
-
-
-
- - -
- - - -
-
- - diff --git a/docs/mockups/terminal-v4/02-settings-editor.html b/docs/mockups/terminal-v4/02-settings-editor.html deleted file mode 100644 index 26ce804..0000000 --- a/docs/mockups/terminal-v4/02-settings-editor.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - -Filesmith, Convert - - - - - - - - -
- -
-
Filesmith
-
Convert
-
- - - -
- -
- - - - -
-
- -
- - -
-
- -
- -
- -
- - -
-
Format
-
- -
Format: TargetModified
-
The file type every image in the queue is converted to.
-
-
- -
-
-
- -
Quality
-
- -
Quality: LevelModified
-
Trade file size against detail. Balanced suits most photos.
-
-
- -
-
-
- -
Output
-
- -
Output: Location
-
Where converted files are saved. Originals are never replaced.
-
- - -
-
- -
Metadata
-
- -
Metadata: Keep
- -
-
-
-
- - - -
- - -
- - -
- -
-
- - diff --git a/docs/mockups/terminal-v4/03-twin-stripes.html b/docs/mockups/terminal-v4/03-twin-stripes.html deleted file mode 100644 index c73f4a4..0000000 --- a/docs/mockups/terminal-v4/03-twin-stripes.html +++ /dev/null @@ -1,426 +0,0 @@ - - - - - -Filesmith, Twin Stripes - - - - - - - - - - - -
-
- -
-
- - - -
-
- - - -
-
- -
- - - - -
-
-
Convert
-
- - - - -
- -
- - -
-
- -
-
-
-
Name
-
Size
-
Result
-
Status
-
-
- -
-
-
IMG_4821.HEIC
-
3.2 MB
-
640 KB−80%
-
Done
-
-
- -
-
-
product-shot.jpg
-
2.1 MB
-
486 KB−77%
-
Done
-
-
- -
-
-
screenshot-2026-10-03.png
-
1.8 MB
-
62%
-
Converting
-
-
- -
-
-
hero-banner@2x.png
-
4.6 MB
-
-
Queued
-
-
- -
-
-
scan_0091.tiff
-
22.4 MB
-
Unsupported compression
-
Failed
-
-
- -
-
-
logo-final.bmp
-
1.1 MB
-
-
Queued
-
-
- -
Drop files here or
-
- - -
-
- Previewproduct-shot.jpg -
- - -
-
-
-
-
- -
-
-
Outputproduct-shot.webp
-
FormatJPGWebP
-
Size2.1 MB486 KB
-
Dimensions2400 × 1600
-
QualityBalanced, q 82
-
MetadataKept
-
Saved toNext to source
-
-
-
-
- - - - - - -
- -
- -
- - diff --git a/docs/mockups/terminal-v4/04-verb-tabs.html b/docs/mockups/terminal-v4/04-verb-tabs.html deleted file mode 100644 index b4fe8fc..0000000 --- a/docs/mockups/terminal-v4/04-verb-tabs.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - -Filesmith – Verb Tabs - - - - - - - -
- -
-
- - - -
-
- - - - - -
-
-
- - - - - - - -
- -
-
- - Name - Type - Size - Status - -
- -
- - IMG_4821.HEIC - HEIC - 3.2 MB640 KB - Done - -
-
- - product-shot.jpg - JPG - 2.1 MB486 KB - Done - -
-
- - screenshot-2026-10-03.png - PNG - 1.8 MB - 62% - -
-
- - hero-banner@2x.png - PNG - 4.6 MB - Queued - -
-
- - scan_0091.tiff - TIFF - 22.4 MB - Unsupported compression - -
-
- - logo-final.bmp - BMP - 1.1 MB - Queued - -
- -
Drop files here or
-
- - -
-
- Details - IMG_4821.HEIC - - - -
-
-
-
-
- - - - - -
-
Before, HEIC3.2 MB
-
-
-
- - - - -
-
After, WebP640 KB
-
-
-
-
FormatHEICWebP
-
Dimensions4032 × 3024
-
Size3.2 MB640 KB
-
Saved80%
-
MetadataKept
-
OutputIMG_4821.webp
-
-
-
-
- - - -
- - -
- Converting - 1 failed - - 2 of 6 done -
- - - diff --git a/docs/mockups/terminal-v4/05-project-widget.html b/docs/mockups/terminal-v4/05-project-widget.html deleted file mode 100644 index c92b135..0000000 --- a/docs/mockups/terminal-v4/05-project-widget.html +++ /dev/null @@ -1,494 +0,0 @@ - - - - - -Filesmith - - - - - - - - -
- -
- - - - -
- - -
- - - -
-
- - - -
- -
-
- - - - - - - -
- -
-
- Name - SizeResultStatus -
- -
- - IMG_4821.HEIC - 3.2 MB - - 640 KB - done - -
-
- - product-shot.jpg - 2.1 MB - - 486 KB - done - -
-
- - screenshot-2026-10-03.png - 1.8 MB - - 62% - -
-
- - hero-banner@2x.png - 4.6 MB - - queued - -
-
- - scan_0091.tiff - 22.4 MB - - Unsupported compression - -
-
- - logo-final.bmp - 1.1 MB - - queued - -
-
Drop files here, or
-
- - -
-
- - IMG_4821.HEIC - - - -
-
-
-
- -
- -
- - - HEIC - WebP -
-
OriginalConverted
-
-
-
File
-
Dimensions4032 × 3024
-
FormatHEIC → WebP
-
Size3.2 MB → 640 KB
-
Saved80%
-
Output
-
NameIMG_4821.webp
-
FolderNext to source
-
MetadataKept
-
-
-
-
- - - -
- - -
- 2 of 6 done -
-
- - - - diff --git a/docs/mockups/terminal-v4/06-preferences-tree.html b/docs/mockups/terminal-v4/06-preferences-tree.html deleted file mode 100644 index a9d54d7..0000000 --- a/docs/mockups/terminal-v4/06-preferences-tree.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - -Filesmith Preferences Tree - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
Filesmith
- -
- - - -
-
- -
- - - -
- -
-
- ConvertFormat - For 6 images - -
-
-
-
Target format
-
Save as -
- -
- Small files, opens everywhere -
-
-
-
Quality
-
Level -
- Looks the same as the source at about a quarter of the size -
-
-
-
Output
-
Save to -
- Next to source - Choose folder -
- -
-
-
-
Metadata
-
- Keep metadataCamera data, dates and color profile -
-
-
-
- - -
-
-
- Queue6 - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
NameDimensionsSizeStatus
IMG_4821.HEIC4032 × 30243.2 MB640 KBDone
product-shot.jpg2400 × 24002.1 MB486 KBDone
screenshot-2026-10-03.png2880 × 18001.8 MB62%
hero-banner@2x.png3200 × 12004.6 MBQueued
scan_0091.tiff5100 × 700022.4 MBUnsupported compression
logo-final.bmp1024 × 10241.1 MBQueued
-
Drop files here or browse
-
-
-
- -
- Converting 3 of 6 - 1 failed - 2 of 6 done -
-
- - diff --git a/docs/mockups/terminal-v4/07-zed-hairline.html b/docs/mockups/terminal-v4/07-zed-hairline.html deleted file mode 100644 index 6674212..0000000 --- a/docs/mockups/terminal-v4/07-zed-hairline.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - -Filesmith, Hairline - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
Filesmith/Convert
-
-
- - - -
-
- -
- - -
-
-
Convert 6 files
-
- - - - - -
-
-
NameSizeResult
- -
- - IMG_4821.HEIC - 3.2 MB - 640 KB - -
-
-
-
- - - - - -
HEIC3.2 MB
-
- - - - - -
WebP640 KB
-
-
-
FormatHEIC WebP
-
Size3.2 MB640 KB−80%
-
Dimensions4032 × 3024
-
Saved toIMG_4821.webp
-
-
- -
- - product-shot.jpg - 2.1 MB - 486 KB - -
-
- - screenshot-2026-10-03.png - 1.8 MB - 62% - -
-
- - hero-banner@2x.png - 4.6 MB - queued - -
-
- - scan_0091.tiff - 22.4 MB - Unsupported compression - -
-
- - logo-final.bmp - 1.1 MB - queued - -
-
- - Drop files or add files -
- -
- -
- - -
- -
-
Converting 3 of 6
-
1 failed
-
2 of 6 done
-
-
- - diff --git a/docs/mockups/terminal-v4/08-fleet-grid.html b/docs/mockups/terminal-v4/08-fleet-grid.html deleted file mode 100644 index 1170b08..0000000 --- a/docs/mockups/terminal-v4/08-fleet-grid.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -Filesmith, Fleet Grid - - - - - - - - -
-
Filesmith
- -
- - - -
-
- - - -
-
- -
-

Options

- - .webp -
- -
-
Format
-
-
- -
-
- -
Quality
-
-
- -
-
- -
Output
-
- - -
- -
Keep metadata
-
- -
-
- -
- 6 images → WebP, balanced, next to source - - -
- -
-
-

Queue

- 6 - - - -
- -
-
- - Name - Type - Size - Status - -
-
-
-
- IMG_4821.HEIC - HEIC - 3.2 MB640 KB - done - -
-
-
- product-shot.jpg - JPG - 2.1 MB486 KB - done - -
-
-
- screenshot-2026-10-03.png - PNG - 1.8 MB - 62% - -
-
-
- hero-banner@2x.png - PNG - 4.6 MB - queued - -
-
-
- scan_0091.tiff - TIFF - 22.4 MB - Unsupported compression - -
-
-
- logo-final.bmp - BMP - 1.1 MB - queued - -
-
-
Drop files here, or browse
-
-
- -
-
- -
- - - - -
- - diff --git a/docs/mockups/terminal-v4/09-walkthrough-steps.html b/docs/mockups/terminal-v4/09-walkthrough-steps.html deleted file mode 100644 index 6c17acf..0000000 --- a/docs/mockups/terminal-v4/09-walkthrough-steps.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - -Filesmith, Walkthrough - - - - - - - -
-
- - Filesmith -
-
Convert
-
- - - -
-
- -
- - - - - -
-
Convert -
- -
-
-
-

Convert images

-
4 of 4 ready
-
- -
    -
  1. - -
    -

    Drop files on the queue, or pick them here.

    - -
    -
  2. -
  3. - -
    -

    Every file in the queue becomes this format.

    -
    - - - - - - -
    -
    Transparency yesTypical size -70%
    -
    - -
    -
    -
  4. -
  5. - -
    -

    Trade file size against detail.

    -
    - -
    -
    -
    -
  6. -
  7. - -
    -

    Where converted files are saved.

    - - - -
    -
  8. -
- -
- -
-
Batch
-
-
Files
6 images
-
Converts to
WebP, balanced
-
Input
35.2 MB
-
Estimated
7.9 MB  -78%
-
-
-
- -
-
- - -
-
-
-

Queue

6 -
- - - - -
-
- -
-
-
Name
Size
Status
-
-
-
- IMG_4821.HEIC - 3.2 MB640 KB - done - -
-
- product-shot.jpg - 2.1 MB486 KB - done - -
-
- screenshot-2026-10-03.png - 1.8 MB - 62% - -
-
- hero-banner@2x.png - 4.6 MB - queued - -
-
- scan_0091.tiff - 22.4 MB - Unsupported compression - -
-
- logo-final.bmp - 1.1 MB - queued - -
-
Drop files here or
-
-
-
- - -
-
- -
- - -
-
-
-
-
-
- - - - - - - - -
-
HEICSource3.2 MB
-
-
-
- - - - - - - -
-
WebPResult640 KB
-
-
-
-
-
File
-
-
Dimensions
4032 × 3024
-
Format
HEIC  →  WebP
-
Size
3.2 MB → 640 KB
-
Saved
80%
-
-
-
-
Output
-
-
Name
IMG_4821.webp
-
Location
Next to source
-
Metadata
Kept
-
Took
1.4 s
-
-
-
-
-
-
-
- - -
-
Converting 3 of 6
-
1 failed
-
2 of 6 done
-
- - - - diff --git a/docs/mockups/terminal-v4/10-explorer-details.html b/docs/mockups/terminal-v4/10-explorer-details.html deleted file mode 100644 index b2bcea5..0000000 --- a/docs/mockups/terminal-v4/10-explorer-details.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - -Filesmith Details - - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
- -
-
Name
-
Kind
-
Size
-
Result
-
Status
-
- -
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB−80%
-
Done
-
- -
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB−77%
-
Done
-
- -
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
62%
-
Converting
-
- -
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
Drop files here, or
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
- -
- - - - -
- - -
-
Converting 1 of 6
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v4/11-nova-prefpane.html b/docs/mockups/terminal-v4/11-nova-prefpane.html deleted file mode 100644 index c18f1d1..0000000 --- a/docs/mockups/terminal-v4/11-nova-prefpane.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -Filesmith Pref Pane - - - - - - - - -
-
Filesmith
-
Convert
-
- - - -
-
- - - - - -
-
-
- Format: -
-
- -
-
Small files that open in every browser.
-
-
-
- Quality: -
-
-
Looks the same at about a fifth of the size.
-
-
- -
- -
- Save to: -
- - -
-
-
- Metadata: -
- -
Camera data, dates and colour profile.
-
-
- -
- -
- - -
-
-
- - -
-
- Queue6 -
- - -
- -
-
- - Name - Type - Size - - Status - -
- -
- - IMG_4821.HEIC - HEIC - 3.2 MB640 KB - - Done - -
-
- - product-shot.jpg - JPG - 2.1 MB486 KB - - Done - -
-
- - screenshot-2026-10-03.png - PNG - 1.8 MB - - 62% - -
-
- - hero-banner@2x.png - PNG - 4.6 MB - - Queued - -
-
- - scan_0091.tiff - TIFF - 22.4 MB - - Unsupported compression - -
-
- - logo-final.bmp - BMP - 1.1 MB - - Queued - -
-
Drop more files here or browse
-
- - -
- - -
- -
- - - diff --git a/docs/mockups/terminal-v4/12-options-sidebar.html b/docs/mockups/terminal-v4/12-options-sidebar.html deleted file mode 100644 index 779978f..0000000 --- a/docs/mockups/terminal-v4/12-options-sidebar.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - -Filesmith Options Sidebar - - - - - - - - - -
-
Filesmith
-
Convert  /  6 files
-
- - - -
-
- -
- - - - - - - -
-
-
Queue6 files
-
- - - -
-
- -
-
- - Name - Type - Size - Status - -
- -
-
-
IMG_4821.HEIC
HEIC
-
3.2 MB640 KB
-
Done
- -
- -
-
-
product-shot.jpg
JPG
-
2.1 MB486 KB
-
Done
- -
- -
-
-
screenshot-2026-10-03.png
PNG
-
1.8 MB
-
62%
- -
- -
-
-
hero-banner@2x.png
PNG
-
4.6 MB
-
Queued
- -
- -
-
-
scan_0091.tiff
TIFF
-
22.4 MB
-
Unsupported compression
- -
- -
-
-
logo-final.bmp
BMP
-
1.1 MB
-
Queued
- -
- -
Drop files here, or
-
- -
-
- - -
- -
-
-
-
-
-
-
-
-
-
-
-
File
screenshot-2026-10-03.png
-
Dimensions
2880 × 1800
-
Size
1.8 MB estimated ~ 310 KB
-
Converting to
WebP, balanced
-
Saves to
Next to source
-
Progress
62%
-
-
-
-
-
- -
- - - -
- - diff --git a/docs/mockups/terminal-v4/13-run-configurations.html b/docs/mockups/terminal-v4/13-run-configurations.html deleted file mode 100644 index 07251d6..0000000 --- a/docs/mockups/terminal-v4/13-run-configurations.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - -Filesmith, Run Configurations - - - - - - - - -
- -
-
Filesmith
- - - -
- - - -
-
- - - -
-
- -
- - - -
- -
- - -
-
WebP · Balancedused for the next run - default
- -
-
WebP · Balanced
-
- -
Format -
- -
- -
Quality -
- -
Sharp at a fraction of the size
- -
Output -
-
- -
Metadata -
- Camera data, dates and colour profile
- -
Output name
-
Example - IMG_4821.HEIC IMG_4821.webp
-
- - -
- - -
- Queue 6 - - - - - - -
- - -
-
Name SizeStatus
- -
IMG_4821.HEIC - 3.2 MB640 KB - Done -
- -
product-shot.jpg - 2.1 MB486 KB - Done -
- -
screenshot-2026-10-03.png - 1.8 MB - 62% -
- -
hero-banner@2x.png - 4.6 MB - Queued -
- -
scan_0091.tiff - 22.4 MB - Unsupported compression -
- -
logo-final.bmp - 1.1 MB - Queued -
- -
Drop files here or add files
-
-
-
- - -
- Converting 3 of 6 - 1 failed - - 2 of 6 done -
-
- - diff --git a/docs/mockups/terminal-v4/14-command-center.html b/docs/mockups/terminal-v4/14-command-center.html deleted file mode 100644 index c2d629b..0000000 --- a/docs/mockups/terminal-v4/14-command-center.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - -Filesmith Command Center - - - - - - - - -
- -
-
- -
- - - -
-
- -
- - -
- -
- -
- - - - - -
-
- -
- - -
- - Name - Dimensions - Status - Size - -
-
-
- - IMG_4821.HEIC - 4032 × 3024 - Done - 3.2 MB640 KB - -
-
- - product-shot.jpg - 2400 × 1600 - Done - 2.1 MB486 KB - -
-
- - screenshot-2026-10-03.png - 2880 × 1800 - 62% - 1.8 MB - -
-
- - hero-banner@2x.png - 3840 × 1280 - Queued - 4.6 MB - -
-
- - scan_0091.tiff - 5100 × 6600 - Unsupported compression - 22.4 MB - -
-
- - logo-final.bmp - 1024 × 1024 - Queued - 1.1 MB - -
-
-
- - Drop files anywhere, or -
- - -
- - - - - - -
- -
-
-
- - -
- - - - -
-
- - diff --git a/docs/mockups/terminal-v4/15-split-editor.html b/docs/mockups/terminal-v4/15-split-editor.html deleted file mode 100644 index 1459029..0000000 --- a/docs/mockups/terminal-v4/15-split-editor.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - -Filesmith - - - - - - - - -
- -
-
Filesmith
-
- -
- - -
- - - -
-
- -
- - - - - - - -
- -
-
-
Queue6
-
Completed142
-
-
- -
- - - -
- 6 files, 35.2 MB -
-
- - Name - Size - Result - -
-
    -
  • -
    - IMG_4821.HEIC - 3.2 MB - 640 KB - -
  • -
  • -
    - product-shot.jpg - 2.1 MB - 486 KB - -
  • -
  • -
    - screenshot-2026-10-03.png - 1.8 MB - 62% - -
  • -
  • -
    - hero-banner@2x.png - 4.6 MB - queued - -
  • -
  • -
    - scan_0091.tiff - 22.4 MB - Unsupported compression - -
  • -
  • -
    - logo-final.bmp - 1.1 MB - queued - -
  • -
-
Drop files here or
-
-
Saved so far 4.17 MBAverage 78% smaller
-
- -
- - -
-
-
product-shot.jpg
-
- - -
-
- -
-
- - -
-
- -
-
-
-
BeforeJPG 2.1 MB
-
-
-
-
AfterWebP 486 KB
-
-
-
-
Properties
- - - - - - - - - - -
PropertyBeforeAfter
Dimensions2400 × 16002400 × 1600
FormatJPGWebP
Size2.1 MB486 KB
Qualityq 92Balanced, q 80
MetadataEXIF, ICCKept
Saved77%
-
-
-
- - -
- Converting 3 of 6 - 1 failed - - 2 of 6 done -
-
- - diff --git a/docs/mockups/terminal-v4/16-state-tree.html b/docs/mockups/terminal-v4/16-state-tree.html deleted file mode 100644 index e4c3213..0000000 --- a/docs/mockups/terminal-v4/16-state-tree.html +++ /dev/null @@ -1,460 +0,0 @@ - - - - - -Filesmith – State Tree - - - - - -
- -
-
- -
- - - -
-
- - - - - - - - -
-
- -
- - -
-
- -
-
-
- -
-
- Convert to -
- - - - - - -
-
-
-
- -
- -
-
- Preset -
- - - -
-
-
-
- -
- -
-
- Save to -
- - -
-
-
Originals are never overwritten.
-
-
- -
- -
-
- Source data - -
-
Camera data, dates and colour profile.
-
-
- -
- -
-
- -
-
-
-
- - -
-
Converting
-
1 failed
-
2 of 6 done
-
-
- - diff --git a/docs/mockups/terminal-v4/17-sublime-quiet.html b/docs/mockups/terminal-v4/17-sublime-quiet.html deleted file mode 100644 index a84c1da..0000000 --- a/docs/mockups/terminal-v4/17-sublime-quiet.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Filesmith - Quiet - - - - - - - - -
- -
-
- -
-
- - - - - - -
-
- - - - -
-
-
- - Name - Size - Status - -
- -
- - - IMG_4821.HEIC - 3.2 MB640 KB - - -
- -
- - - product-shot.jpg - 2.1 MB486 KB - - -
- -
- - - screenshot-2026-10-03.png - 1.8 MB - 62% - -
- -
- - - hero-banner@2x.png - 4.6 MB - - -
- -
- - - scan_0091.tiff - 22.4 MB - Unsupported compression - -
- -
- - - logo-final.bmp - 1.1 MB - - -
- - -
- - -
- - -
- - - - - product-shot.jpg2.1 MB → 486 KB - -
- -
- - - - 2 of 6 done -
-
- - diff --git a/docs/mockups/terminal-v4/18-labelled-activity.html b/docs/mockups/terminal-v4/18-labelled-activity.html deleted file mode 100644 index a8a47d3..0000000 --- a/docs/mockups/terminal-v4/18-labelled-activity.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - -Filesmith Labelled Bar - - - - - - - - -
-
-
Filesmith
- -
- - - -
-
- -
- - - - -
-
-

Queue

6 files -
- - - - -
-
- -
- - Name - Size - Status - -
-
- - IMG_4821.HEIC - 3.2 MB640 KB - Done - -
-
- - product-shot.jpg - 2.1 MB486 KB - Done - -
-
- - screenshot-2026-10-03.png - 1.8 MB - 62% - -
-
- - hero-banner@2x.png - 4.6 MB - Queued - -
-
- - scan_0091.tiff - 22.4 MB - Unsupported compression - -
-
- - logo-final.bmp - 1.1 MB - Queued - -
- -
Drop more files here
-
- - - -
- -
- - - -
-
- - diff --git a/docs/mockups/terminal-v4/19-properties-window.html b/docs/mockups/terminal-v4/19-properties-window.html deleted file mode 100644 index 4210585..0000000 --- a/docs/mockups/terminal-v4/19-properties-window.html +++ /dev/null @@ -1,363 +0,0 @@ - - - - - -Filesmith Properties Window - - - - - - - -
-
- -
- - - -
-
- - - - - -
-
-
Convert queue (6)
- -
- -
- - - - -
- -
- Name TypeSizeStatus -
- -
- - IMG_4821.HEICHEIC - 3.2 MB640 KB - Done -
-
- - product-shot.jpgJPG - 2.1 MB486 KB - Done -
-
- - screenshot-2026-10-03.pngPNG - 1.8 MB - 62% -
-
- - hero-banner@2x.pngPNG - 4.6 MB - Queued -
-
- - scan_0091.tiffTIFF - 22.4 MB - Unsupported compression -
-
- - logo-final.bmpBMP - 1.1 MB - Queued -
- -
Drop files here or
- -
- -
-
- - - - - - -
- - - -
- - - diff --git a/docs/mockups/terminal-v4/20-navigator-selector.html b/docs/mockups/terminal-v4/20-navigator-selector.html deleted file mode 100644 index 162237d..0000000 --- a/docs/mockups/terminal-v4/20-navigator-selector.html +++ /dev/null @@ -1,477 +0,0 @@ - - - - - -Filesmith - - - - - - - -
-
Filesmith
-
- - -
- - - -
- -
- - - - - -
-
- - -
- - - - - -
- - -
- -
-
-
-
-
-
-
-
-
-
- JPG 2.1 MB - WebP 486 KB -
-
- -
- product-shot.jpg -
- 1600 × 1200 -
- -
-
- - - -
- - -
- - -
- 2 of 6 done -
- - - diff --git a/docs/mockups/terminal-v4/index.html b/docs/mockups/terminal-v4/index.html deleted file mode 100644 index d865cf8..0000000 --- a/docs/mockups/terminal-v4/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - -Filesmith IDE mockups - -

Filesmith / terminal-v4 / IDE-inspired layouts

-

20 directions that borrow from how IDEs lay out simple, easy to navigate settings pages and menus. Click a card to open the mockup.

-
- - Explorer mockup -
01Explorer
-

VS Code activity bar (2px edge bar active, badge), Explorer sidebar view with 22px collapsible section headers, empty editor as preview, status bar

-

The VS Code Explorer turned into a file tool. A narrow activity bar holds the verbs, and a 300px sidebar stacks collapsible QUEUE, OPTIONS and OUTPUT sections. The editor area previews the selected file. It is calm and familiar, and nothing floats.

-
- - Settings Editor mockup -
02Settings Editor
-

VS Code Settings editor (search + category tree + stacked rows, modified bar), VS Code secondary side bar, activity bar

-

Convert options read like VS Code's Settings UI: a search field, a category tree and stacked setting rows with a one-line description each. The queue lives in a secondary sidebar on the right. It is the literal 'IDE settings page' feel the owner asked for.

-
- - Twin Stripes mockup -
03Twin Stripes
-

JetBrains New UI stripes (filled square active, separators), run widget in the title bar, tool windows (Options docked right), compact toolbar

-

JetBrains New UI framing: a tool window stripe on each edge, the queue as the main table, and a run widget in the title bar that holds the primary action, the way IntelliJ holds Run.

-
- - Verb Tabs mockup -
04Verb Tabs
-

VS Code editor tabs (active top border, merges into content), breadcrumbs bar, JetBrains-style property inspector rows

-

The verbs are editor tabs across the top, each with an icon, and Convert is the active tab merging into the content. A breadcrumb names the target. A plain property inspector holds the options. There is no rail at all.

-
- - Project Widget mockup -
05Project Widget
-

Zed / JetBrains title bar project picker, Zed flat list panes, inspector pane with disclosure groups

-

Zed and JetBrains style: no rail. The verb is picked from a 'Convert ▾' widget in the title bar, so the whole window belongs to a flat queue list and an inspector. The most uncluttered take.

-
- - Preferences Tree mockup -
06Preferences Tree
-

JetBrains Settings dialog (tree with search, breadcrumb header, titled-separator groups), horizontal split

-

The JetBrains Settings dialog as a whole app. A 220px tree lists the verbs, and each verb expands to its option pages (Convert › Format, Quality, Output). A breadcrumb header and titled separators replace cards, and the queue sits in a lower split.

-
- - Hairline mockup -
07Hairline
-

Zed (thin dock, crisp mono, hairline panes, slim pane headers), VS Code status bar

-

Zed minimalism with enough substance: a 40px icon column, one hairline split between queue and options, mono for data. Quiet, but every verb, row and button carries an icon.

-
- - Fleet Grid mockup -
08Fleet Grid
-

JetBrains Fleet top toolbar and centred workspace, property grid / key-value table, compact toolbar

-

JetBrains Fleet: a top toolbar instead of a rail, a centred workspace, and options as a crisp key-value property grid. Modern IDE-lite with air, still compact.

-
- - Walkthrough mockup -
09Walkthrough
-

VS Code Welcome / Walkthrough step list (expanding step, check glyphs), activity bar, status bar

-

Borrowed from VS Code's Get Started walkthroughs: the left pane is a short numbered checklist (Add files, Format, Quality, Output), the active step expands inline to its control, finished steps show a check and their value. Setup becomes a guided menu, the queue fills the rest.

-
- - Details + Inspector mockup -
10Details + Inspector
-

JetBrains / Explorer list with sortable column headers, Xcode inspector segmented icon tabs, property grid for Info

-

Explorer details view meets the Xcode inspector. The queue is a sortable column table, and the right inspector switches between Options, Preview and Info with icon segments. Power-user, but tidy.

-
- - Pref Pane mockup -
11Pref Pane
-

Nova / macOS preference-pane icon toolbar (square, monochrome), two-column right-aligned label forms, status bar

-

Panic Nova and classic preference panes: a top toolbar of square verb icons with small labels, and a two-column right-aligned form beside the queue. Reads like a well-made desktop app, not a web page.

-
- - Options Sidebar mockup -
12Options Sidebar
-

VS Code activity bar, a sidebar view titled like settings with stacked setting rows, editor area as details list, editor header actions

-

An activity bar plus a sidebar that IS the options: flush setting rows stacked in a 320px view, separated by hairlines, no cards, no row icons. The editor area is a large, airy details list of the queue.

-
- - Run Configurations mockup -
13Run Configurations
-

JetBrains Run/Debug Configurations dialog (config list + form), JetBrains stripe, compact toolbar

-

JetBrains Run/Debug Configurations as the options model: a short list of named targets on the left, the selected one's form on the right, and the queue below. Picking a setup feels like picking a run config.

-
- - Command Center mockup -
14Command Center
-

VS Code Command Center in the title bar, quick pick (closed trigger), breadcrumbs, status bar

-

The VS Code Command Center drives everything: a flat title-bar field searches verbs, files and settings. The verb and format show as a breadcrumb of dropdown triggers. Minimal chrome for keyboard users.

-
- - Split Editor mockup -
15Split Editor
-

VS Code split editor groups with their own tabs, property grid, sidebar collapsible sections

-

Two editor groups side by side: the queue on the left, and a per-file before/after view on the right with a property grid. Options sit in a collapsible sidebar section. Best layout for checking results.

-
- - State Tree mockup -
16State Tree
-

VS Code tree view with indent guides and focus outline, Problems view grouping, inspector disclosure groups

-

The queue is a tree whose top nodes are states (Failed, Running, Queued, Done) with counts, and indent guides lead to the files. Problems surface first, the way an IDE's Problems view does. Options sit as a centred form.

-
- - Quiet mockup -
17Quiet
-

Sublime Text quiet chrome, tab top-line, single-line inline bar (Find panel), status bar

-

Sublime-quiet: almost no chrome, verb tabs with icon and label in the title bar, and every option squeezed into one inline bar above the queue, like Sublime's Find panel. The window is almost all files.

-
- - Labelled Bar mockup -
18Labelled Bar
-

Labelled tool-window bar (Android Studio / Fleet), JetBrains property rows, status bar

-

An activity bar with a small label under every icon, like IDE tool-window names, so it is easy to navigate without tooltips, next to a compact property panel. Friendliest for non-developers.

-
- - Properties Window mockup -
19Properties Window
-

Visual Studio Properties window (categorised grid, description pane), tool window title bars with tab wells, document tab toolbar

-

Classic Visual Studio docking: the queue is a document tab, and a Properties tool window holds the options as a categorised property grid with a description box at the bottom that explains the focused setting. Familiar, structured, explanation only on demand.

-
- - Navigator mockup -
20Navigator
-

Xcode navigator selector bar and jump bar, JetBrains titled separators, VS Code status bar

-

Xcode's navigator selector bar: the verbs are a row of icons across the top of the left pane, which holds the queue below them. A jump bar names the target, and an inspector holds the options. A single-pane-per-job layout that is not any one IDE.

-
-
- diff --git a/docs/mockups/terminal-v4/shots/01-activity-explorer.png b/docs/mockups/terminal-v4/shots/01-activity-explorer.png deleted file mode 100644 index 90539d5..0000000 Binary files a/docs/mockups/terminal-v4/shots/01-activity-explorer.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/02-settings-editor.png b/docs/mockups/terminal-v4/shots/02-settings-editor.png deleted file mode 100644 index 8a2ddb9..0000000 Binary files a/docs/mockups/terminal-v4/shots/02-settings-editor.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/03-twin-stripes.png b/docs/mockups/terminal-v4/shots/03-twin-stripes.png deleted file mode 100644 index 0d34b73..0000000 Binary files a/docs/mockups/terminal-v4/shots/03-twin-stripes.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/04-verb-tabs.png b/docs/mockups/terminal-v4/shots/04-verb-tabs.png deleted file mode 100644 index 0b23700..0000000 Binary files a/docs/mockups/terminal-v4/shots/04-verb-tabs.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/05-project-widget.png b/docs/mockups/terminal-v4/shots/05-project-widget.png deleted file mode 100644 index 61e419e..0000000 Binary files a/docs/mockups/terminal-v4/shots/05-project-widget.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/06-preferences-tree.png b/docs/mockups/terminal-v4/shots/06-preferences-tree.png deleted file mode 100644 index 458dbc3..0000000 Binary files a/docs/mockups/terminal-v4/shots/06-preferences-tree.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/07-zed-hairline.png b/docs/mockups/terminal-v4/shots/07-zed-hairline.png deleted file mode 100644 index 13b7d09..0000000 Binary files a/docs/mockups/terminal-v4/shots/07-zed-hairline.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/08-fleet-grid.png b/docs/mockups/terminal-v4/shots/08-fleet-grid.png deleted file mode 100644 index 1d67aee..0000000 Binary files a/docs/mockups/terminal-v4/shots/08-fleet-grid.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/09-walkthrough-steps.png b/docs/mockups/terminal-v4/shots/09-walkthrough-steps.png deleted file mode 100644 index 30138ee..0000000 Binary files a/docs/mockups/terminal-v4/shots/09-walkthrough-steps.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/10-explorer-details.png b/docs/mockups/terminal-v4/shots/10-explorer-details.png deleted file mode 100644 index 9669e6e..0000000 Binary files a/docs/mockups/terminal-v4/shots/10-explorer-details.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/11-nova-prefpane.png b/docs/mockups/terminal-v4/shots/11-nova-prefpane.png deleted file mode 100644 index 623d798..0000000 Binary files a/docs/mockups/terminal-v4/shots/11-nova-prefpane.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/12-options-sidebar.png b/docs/mockups/terminal-v4/shots/12-options-sidebar.png deleted file mode 100644 index cf02fe7..0000000 Binary files a/docs/mockups/terminal-v4/shots/12-options-sidebar.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/13-run-configurations.png b/docs/mockups/terminal-v4/shots/13-run-configurations.png deleted file mode 100644 index a69d743..0000000 Binary files a/docs/mockups/terminal-v4/shots/13-run-configurations.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/14-command-center.png b/docs/mockups/terminal-v4/shots/14-command-center.png deleted file mode 100644 index 6d61c58..0000000 Binary files a/docs/mockups/terminal-v4/shots/14-command-center.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/15-split-editor.png b/docs/mockups/terminal-v4/shots/15-split-editor.png deleted file mode 100644 index 5b629e4..0000000 Binary files a/docs/mockups/terminal-v4/shots/15-split-editor.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/16-state-tree.png b/docs/mockups/terminal-v4/shots/16-state-tree.png deleted file mode 100644 index 538d00e..0000000 Binary files a/docs/mockups/terminal-v4/shots/16-state-tree.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/17-sublime-quiet.png b/docs/mockups/terminal-v4/shots/17-sublime-quiet.png deleted file mode 100644 index a1b30c4..0000000 Binary files a/docs/mockups/terminal-v4/shots/17-sublime-quiet.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/18-labelled-activity.png b/docs/mockups/terminal-v4/shots/18-labelled-activity.png deleted file mode 100644 index 626d605..0000000 Binary files a/docs/mockups/terminal-v4/shots/18-labelled-activity.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/19-properties-window.png b/docs/mockups/terminal-v4/shots/19-properties-window.png deleted file mode 100644 index 6829593..0000000 Binary files a/docs/mockups/terminal-v4/shots/19-properties-window.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/20-navigator-selector.png b/docs/mockups/terminal-v4/shots/20-navigator-selector.png deleted file mode 100644 index e506d52..0000000 Binary files a/docs/mockups/terminal-v4/shots/20-navigator-selector.png and /dev/null differ diff --git a/docs/mockups/terminal-v4/shots/_index.png b/docs/mockups/terminal-v4/shots/_index.png deleted file mode 100644 index 677e39e..0000000 Binary files a/docs/mockups/terminal-v4/shots/_index.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/01-a-refined.html b/docs/mockups/terminal-v5/01-a-refined.html deleted file mode 100644 index efa5a8c..0000000 --- a/docs/mockups/terminal-v5/01-a-refined.html +++ /dev/null @@ -1,518 +0,0 @@ - - - - - - -Filesmith Refined - - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - - -
-
- - - - - - -
- 6 files, 1 selected - -
-
- -
-
-
Name
-
Kind
-
Size
-
Result
-
Status
-
- -
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB−80%
-
Done
-
- -
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB−77%
-
Done
-
- -
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
62%
-
Converting
-
- -
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - - -
- -
-
Converting 3 of 62 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/02-b-sectioned-inspector.html b/docs/mockups/terminal-v5/02-b-sectioned-inspector.html deleted file mode 100644 index c5c13af..0000000 --- a/docs/mockups/terminal-v5/02-b-sectioned-inspector.html +++ /dev/null @@ -1,455 +0,0 @@ - - - - - - -Filesmith Sectioned - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - - -
- 6 files, 1 selected - -
-
- -
-
-
Name
-
Kind
-
Size
-
Result
-
Status
-
- -
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB−80%
-
Done
-
- -
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB−77%
-
Done
-
- -
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
62%
-
Converting
-
- -
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - - -
- -
-
Converting 3 of 6
-
2 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/03-c-stacked-settings.html b/docs/mockups/terminal-v5/03-c-stacked-settings.html deleted file mode 100644 index b2f7694..0000000 --- a/docs/mockups/terminal-v5/03-c-stacked-settings.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - -Filesmith Stacked Settings - - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - - -
-
- - - - - -
- 6 files, 1 selected - - -
-
- -
-
- -
- - IMG_4821.HEICDone -
HEIC3.2 MB640 KB−80%
- -
- -
- - product-shot.jpgDone -
JPG2.1 MB486 KB−77%
- -
- -
- - screenshot-2026-10-03.pngConverting -
PNG1.8 MB62%
- -
- -
- - hero-banner@2x.pngQueued -
PNG4.6 MB
- -
- -
- - scan_0091.tiffUnsupported compression -
TIFF22.4 MBRe-save the scan as LZW or uncompressed TIFF, then retry
- -
- -
- - logo-final.bmpQueued -
BMP1.1 MB
- -
- -
-
-
- 6 files - 35.2 MB - 5.3 MB1.1 MBso far - 2 of 6 done -
-
-
- - - -
- -
-
Converting 3 of 6
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/04-d-preview-first.html b/docs/mockups/terminal-v5/04-d-preview-first.html deleted file mode 100644 index 2f1669f..0000000 --- a/docs/mockups/terminal-v5/04-d-preview-first.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - -Filesmith Preview First - - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
Name
-
Kind
-
Size
-
Result
-
-
- -
- - -
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
62%Converting to WebP
-
-
- - - -
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
Next up, to WebP
-
-
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
2nd in line, to WebP
-
-
- - - -
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB−80%IMG_4821.webp
-
-
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB−77%product-shot.webp
-
-
- - -
Failed1
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
Unsupported compressionLZW, 16-bit planar
-
-
-
- -
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far2 of 6 done
-
-
-
-
- - - -
- -
-
Converting 3 of 6
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/05-e-flush-panels.html b/docs/mockups/terminal-v5/05-e-flush-panels.html deleted file mode 100644 index 0fab48e..0000000 --- a/docs/mockups/terminal-v5/05-e-flush-panels.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - -Filesmith Flush - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/05-e1-boxed.html b/docs/mockups/terminal-v5/05-e1-boxed.html deleted file mode 100644 index 1deba40..0000000 --- a/docs/mockups/terminal-v5/05-e1-boxed.html +++ /dev/null @@ -1,528 +0,0 @@ - - - - - - -Filesmith Flush Boxed - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/05-e2-raised.html b/docs/mockups/terminal-v5/05-e2-raised.html deleted file mode 100644 index 80e1a8d..0000000 --- a/docs/mockups/terminal-v5/05-e2-raised.html +++ /dev/null @@ -1,529 +0,0 @@ - - - - - - -Filesmith Flush - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/05-e3-bracketed.html b/docs/mockups/terminal-v5/05-e3-bracketed.html deleted file mode 100644 index 3cbd420..0000000 --- a/docs/mockups/terminal-v5/05-e3-bracketed.html +++ /dev/null @@ -1,535 +0,0 @@ - - - - - - -Filesmith Bracketed - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/06-t1-table-boxed.html b/docs/mockups/terminal-v5/06-t1-table-boxed.html deleted file mode 100644 index cea70b8..0000000 --- a/docs/mockups/terminal-v5/06-t1-table-boxed.html +++ /dev/null @@ -1,572 +0,0 @@ - - - - - - -Filesmith Table Boxed - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/07-t2-table-filled.html b/docs/mockups/terminal-v5/07-t2-table-filled.html deleted file mode 100644 index 5c2dfeb..0000000 --- a/docs/mockups/terminal-v5/07-t2-table-filled.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - -Filesmith Table Filled - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/08-t3-table-zebra.html b/docs/mockups/terminal-v5/08-t3-table-zebra.html deleted file mode 100644 index e1fd90a..0000000 --- a/docs/mockups/terminal-v5/08-t3-table-zebra.html +++ /dev/null @@ -1,631 +0,0 @@ - - - - - - -Filesmith Zebra Grid - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/09-s1-vscode-classic.html b/docs/mockups/terminal-v5/09-s1-vscode-classic.html deleted file mode 100644 index 072d706..0000000 --- a/docs/mockups/terminal-v5/09-s1-vscode-classic.html +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - -Filesmith VS Code Classic - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/11-s3-vscode-compact.html b/docs/mockups/terminal-v5/11-s3-vscode-compact.html deleted file mode 100644 index d2cc2be..0000000 --- a/docs/mockups/terminal-v5/11-s3-vscode-compact.html +++ /dev/null @@ -1,588 +0,0 @@ - - - - - - -Filesmith VS Code Compact - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - - -
-
- - - - -
- 6 files, 1 selected - -
-
- -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
IMG_4821.HEIC
-
HEIC
-
3.2 MB
-
640 KB-80%
-
Done
-
- -
-
-
product-shot.jpg
-
JPG
-
2.1 MB
-
486 KB-77%
-
Done
-
- -
-
-
screenshot-2026-10-03.png
-
PNG
-
1.8 MB
-
~410 KB-77%
-
62%(4s)
-
- -
-
-
hero-banner@2x.png
-
PNG
-
4.6 MB
-
-
Queued
-
- -
-
-
scan_0091.tiff
-
TIFF
-
22.4 MB
-
-
Unsupported compression
-
- -
-
-
logo-final.bmp
-
BMP
-
1.1 MB
-
-
Queued
-
- -
-
-
-
6 files
-
-
35.2 MB
-
5.3 MB1.1 MBso far
-
2 of 6 done
-
-
-
- - -
- -
-
Converting 3 of 6
-
2 of 6 done
-
1 failed
-
- - - - diff --git a/docs/mockups/terminal-v5/index.html b/docs/mockups/terminal-v5/index.html deleted file mode 100644 index bb9b4cc..0000000 --- a/docs/mockups/terminal-v5/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - -Filesmith Explorer Variants - -

Filesmith / terminal-v5 / explorer-details variants

-

5 takes on terminal-v4 10-explorer-details. Every one has a collapsible left sidebar that shows labels and icons, and none has the files-added line at the top. They differ in the right-side panel and the main view. Each row shows the sidebar expanded and collapsed. Click to open the mockup.

-
-
- -

Closest to the original: the explorer-details layout with a collapsible labelled sidebar and no files-added line at the top.

- -
-
- -

Right panel without top tabs: one scrolling inspector with JetBrains-style titled separators (FORMAT, QUALITY, OUTPUT, NAMING), label-left/control-right rows and a small summary of the selected file.

- -
-
- -

Right panel like the VS Code settings editor: each setting stacked (bold title, grey description, full-width control), generous rhythm, collapsible groups.

- -
-
- -

Right panel opens with a compact before/after preview of the selected file, with the options below it.

- -
-
- -

Flatter and more brutalist: no rounded corners, panels split by 1px lines only, segmented controls without fills (selected = underline or inverted text).

- -
-
- diff --git a/docs/mockups/terminal-v5/shots/01-a-refined-collapsed.png b/docs/mockups/terminal-v5/shots/01-a-refined-collapsed.png deleted file mode 100644 index 7015710..0000000 Binary files a/docs/mockups/terminal-v5/shots/01-a-refined-collapsed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/01-a-refined.png b/docs/mockups/terminal-v5/shots/01-a-refined.png deleted file mode 100644 index 7016974..0000000 Binary files a/docs/mockups/terminal-v5/shots/01-a-refined.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector-collapsed.png b/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector-collapsed.png deleted file mode 100644 index 3afadc0..0000000 Binary files a/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector-collapsed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector.png b/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector.png deleted file mode 100644 index ae2dc2d..0000000 Binary files a/docs/mockups/terminal-v5/shots/02-b-sectioned-inspector.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/03-c-stacked-settings-collapsed.png b/docs/mockups/terminal-v5/shots/03-c-stacked-settings-collapsed.png deleted file mode 100644 index ae7c74b..0000000 Binary files a/docs/mockups/terminal-v5/shots/03-c-stacked-settings-collapsed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/03-c-stacked-settings.png b/docs/mockups/terminal-v5/shots/03-c-stacked-settings.png deleted file mode 100644 index 4fc5c07..0000000 Binary files a/docs/mockups/terminal-v5/shots/03-c-stacked-settings.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/04-d-preview-first-collapsed.png b/docs/mockups/terminal-v5/shots/04-d-preview-first-collapsed.png deleted file mode 100644 index a6149d9..0000000 Binary files a/docs/mockups/terminal-v5/shots/04-d-preview-first-collapsed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/04-d-preview-first.png b/docs/mockups/terminal-v5/shots/04-d-preview-first.png deleted file mode 100644 index 083a154..0000000 Binary files a/docs/mockups/terminal-v5/shots/04-d-preview-first.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/05-e-flush-panels-collapsed.png b/docs/mockups/terminal-v5/shots/05-e-flush-panels-collapsed.png deleted file mode 100644 index f3e4eea..0000000 Binary files a/docs/mockups/terminal-v5/shots/05-e-flush-panels-collapsed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/05-e-flush-panels.png b/docs/mockups/terminal-v5/shots/05-e-flush-panels.png deleted file mode 100644 index cbbc564..0000000 Binary files a/docs/mockups/terminal-v5/shots/05-e-flush-panels.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/05-e1-boxed.png b/docs/mockups/terminal-v5/shots/05-e1-boxed.png deleted file mode 100644 index dd8f575..0000000 Binary files a/docs/mockups/terminal-v5/shots/05-e1-boxed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/05-e2-raised.png b/docs/mockups/terminal-v5/shots/05-e2-raised.png deleted file mode 100644 index ea070f3..0000000 Binary files a/docs/mockups/terminal-v5/shots/05-e2-raised.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/05-e3-bracketed.png b/docs/mockups/terminal-v5/shots/05-e3-bracketed.png deleted file mode 100644 index 80124dc..0000000 Binary files a/docs/mockups/terminal-v5/shots/05-e3-bracketed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/06-t1-table-boxed.png b/docs/mockups/terminal-v5/shots/06-t1-table-boxed.png deleted file mode 100644 index 6f50041..0000000 Binary files a/docs/mockups/terminal-v5/shots/06-t1-table-boxed.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/07-t2-table-filled.png b/docs/mockups/terminal-v5/shots/07-t2-table-filled.png deleted file mode 100644 index 13d200b..0000000 Binary files a/docs/mockups/terminal-v5/shots/07-t2-table-filled.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/08-t3-table-zebra.png b/docs/mockups/terminal-v5/shots/08-t3-table-zebra.png deleted file mode 100644 index ec50223..0000000 Binary files a/docs/mockups/terminal-v5/shots/08-t3-table-zebra.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/09-s1-vscode-classic.png b/docs/mockups/terminal-v5/shots/09-s1-vscode-classic.png deleted file mode 100644 index c69538a..0000000 Binary files a/docs/mockups/terminal-v5/shots/09-s1-vscode-classic.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/11-s3-vscode-compact.png b/docs/mockups/terminal-v5/shots/11-s3-vscode-compact.png deleted file mode 100644 index 5da33dc..0000000 Binary files a/docs/mockups/terminal-v5/shots/11-s3-vscode-compact.png and /dev/null differ diff --git a/docs/mockups/terminal-v5/shots/_index.png b/docs/mockups/terminal-v5/shots/_index.png deleted file mode 100644 index 27d48dc..0000000 Binary files a/docs/mockups/terminal-v5/shots/_index.png and /dev/null differ diff --git a/docs/mockups/terminal/01-wind-native.html b/docs/mockups/terminal/01-wind-native.html deleted file mode 100644 index 64fb829..0000000 --- a/docs/mockups/terminal/01-wind-native.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - -Filesmith · Wind Native - - - -
- - -
-
- - Filesmith -
- convert - - - - -
- -
- - - - -
-
-
-
-

Convert

-

Change format

-
-
8 files4 groups
-
- -
- -
-
- - Drop files here or browse - -
- - -
-
Images4 imagesselected -
- -
-
-
IMG_4821.HEIC
HEIC → WebP · 3.2 MB
-
3.2 MB → 640 KB  -80%
-
-
-
- -
-
-
screenshot-2026-10-03 141522.png
PNG → WebP · 1.8 MB
-
62%  ETA 4 s
-
-
-
-
- -
-
-
hero-banner@2x.png
PNG → WebP · 4.6 MB
-
Queued
-
-
-
- -
-
-
scan_receipt_0091.tiff
TIFF → WebP · 22.4 MB
-
Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
-
-
- - -
-
Video1 videoDifferent group, click to switch
-
-
MOV
-
screen-recording-standup.mov
MOV → MP4 · 812 MB
-
18.4%  ETA 3 min 12 s
-
-
-
-
-
- - -
-
Documents2 documents
-
-
PDF
-
Q3-board-deck.pdf
PDF → DOCX · 14.1 MB
-
Queued
-
-
-
-
-
TXT
-
release-notes-0.3.txt
TXT → PDF · 6 KB
-
6 KB → 48 KB
-
-
- -
-
- - -
-
Archives1 archive
-
-
CBZ
-
One-Piece-v104.cbz
CBZ → CB7 · 186 MB
-
Queued
-
-
-
-
-
- - - -
-
-
- - -
- 41% - 2 of 8 done · 2 running · 1 failed - - RTX 5090 · Real-ESRGAN ready - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not found -
-
- - diff --git a/docs/mockups/terminal/02-wind-dense-inspector.html b/docs/mockups/terminal/02-wind-dense-inspector.html deleted file mode 100644 index e7aad97..0000000 --- a/docs/mockups/terminal/02-wind-dense-inspector.html +++ /dev/null @@ -1,483 +0,0 @@ - - - - - -Filesmith · Dense Inspector - - - - -
- - -
-
- - Filesmith -
- convert / images - - - - -
- -
- - - - - -
-
-

Convert

- Change format - 8 files - - - -
- -
- - add filesCtrl Oor drop anywhere in this window - - images · video · audio · pdf · docs · archives -
- -
-
- - - - - - - - -
- - -
- - Images4 images · active group - 31.9 MB · → WebP -
- -
- - HEIC - IMG_4821.HEIC - 3.2 MB - HEIC→WebP - 3.2M → 640K -80% - done - -
- -
- - PNG - screenshot-2026-10-03 141522.png - 1.8 MB - PNG→WebP - running · eta 4s - 62% - -
- -
- - PNG - hero-banner@2x.png - 4.6 MB - PNG→WebP - queued · #1 - – - -
- -
- - TIFF - scan_receipt_0091.tiff
failed  Unsupported TIFF compression (JPEG-in-TIFF, old-style). Re-save as standard TIFF or PNG and retry.
- 22.4 MB - TIFF→WebP - failed · Unsupported TIFF compression (JPEG-in-TIFF, old-style) - err - -
- - -
- - Video1 video · select to switch group - 812 MB · → MP4 -
-
- - MOV - screen-recording-standup.mov - 812 MB - MOV→MP4 - running · eta 3m 12s - 18.4% - -
- - -
- - Documents2 documents - 14.1 MB · mixed -
-
- - PDF - Q3-board-deck.pdf - 14.1 MB - PDF→DOCX - queued - – - -
-
- - TXT - release-notes-0.3.txt - 6 KB - TXT→PDF - 6K → 48K +700% - done - - -
- - -
- - Archives1 archive - 186 MB · → CB7 -
-
- - CBZ - One-Piece-v104.cbz - 186 MB - CBZ→CB7 - queued - – - -
- -
drop more files anywhere · they join the matching group
-
- 8 rows · 4 groups · 1.03 GB in - ↑↓ moveSpace selectDel removeCtrl Enter convert -
-
-
- - - -
- - -
- 41% - 2 of 8 done · 2 running · 1 failed - - - ffmpeg 7.1 · ImageMagick 7.1.1 · mutool 1.24 · 7-Zip 24.08 · Rar.exe not found - - RTX 5090 · Real-ESRGAN ready -
-
- - diff --git a/docs/mockups/terminal/03-tmux-panes.html b/docs/mockups/terminal/03-tmux-panes.html deleted file mode 100644 index 7bdce06..0000000 --- a/docs/mockups/terminal/03-tmux-panes.html +++ /dev/null @@ -1,561 +0,0 @@ - - - - - - -Filesmith, Tmux Panes - - - - - - -
- - -
- - Filesmith - session filesmith : window 0:convert - - Alt0-6 switch verb   Tab next pane -
- - - -
-
- -
- - - - -
- -
- ─ queue [8] ─ -
-

Convert

- Change format - 8 files -
- - -
- -
──images(4) · selected
- -
- ✓heic - IMG_4821.HEIC3.2M - heic→webp - 3.2M → 640K -80% - -
-
- ▸png - screenshot-2026-10-03 141522.png1.8M - png→webp - [██████▌····] 62% eta 4s - -
- -
- ·png - hero-banner@2x.png4.6M - png→webp - queued - -
- -
- ✗tiff - scan_receipt_0091.tiff22.4M - tiff→webp - failed - -
-
└ Unsupported TIFF compression (JPEG-in-TIFF, old-style)
- -
──video(1)· other group, not in selection
- -
- ▸mov - screen-recording-standup.mov812M - mov→mp4 - [██·········] 18.4% eta 3m12s - -
- -
──documents(2)
- -
- ·pdf - Q3-board-deck.pdf14.1M - pdf→docx - queued - -
- -
- ✓txt - release-notes-0.3.txt6K - txt→pdf - 6K → 48K - - -
- -
──archives(1)
- -
- ·cbz - One-Piece-v104.cbz186M - cbz→cb7 - queued - -
-
- -
- 2 of 8 done · 2 running · 1 failed - [████▌······]41% - - gpu RTX 5090 · Real-ESRGAN ready - -
-
- - -
- ─ log [2 running] ─ -

magick "screenshot-2026-10-03 141522.png" -quality 80 -define webp:method=4 "screenshot-2026-10-03 141522.webp"

-

encoding 2880x1800 rgba, pass 2 of 3, 62%

-

ffmpeg -i screen-recording-standup.mov -c:v libx264 -crf 23 -preset medium -c:a aac screen-recording-standup.mp4

-

frame= 4412 fps=118 q=23.0 size= 38912kB time=00:02:27.06 bitrate=2167.8kbits/s speed=3.93x

-

scan_receipt_0091.tiff: magick exited 1, Unsupported TIFF compression (JPEG-in-TIFF, old-style)

-

-
-
- - - -
- - -
- [filesmith] - - - - - - - - - - ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found, cbr write off - 41% -
-
- - diff --git a/docs/mockups/terminal/04-command-first.html b/docs/mockups/terminal/04-command-first.html deleted file mode 100644 index c7b5449..0000000 --- a/docs/mockups/terminal/04-command-first.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - -Filesmith · Command First - - - - - - -
- - -
-
- - Filesmith -
- -
- - - -
-
- - -
- -
- - - - - - -
- Ctrl K commands - - - -
-
to:webptarget format
-
- - - - - - - - - - -
-
png, tiff off: already a source format← → moveEnter pickEsc close
-
-
- - -
- convert 4 images → webp · balanced · next to source - - never overwrites · collisions save as name (converted).webp, then (2) -
- - -
-
-

Convert

Change format - - 8 files - -
-
-
images· 4selectedtokens apply to this group
-
- - HEIC - IMG_4821.HEIC - 3.2 MB - HEIC → WebP - done · 3.2 MB → 640 KB (-80%) - -
-
- - - PNG - screenshot-2026-10-03 141522.png - 1.8 MB - PNG → WebP - 62% · eta 4 s - -
-
- - PNG - hero-banner@2x.png - 4.6 MB - PNG → WebP - queued - -
-
- - TIFF - scan_receipt_0091.tiff - 22.4 MB - TIFF → WebP - failed · Unsupported TIFF compression (JPEG-in-TIFF, old-style) - -
- -
-
video· 1select to retarget on:
-
- - - MOV - screen-recording-standup.mov - 812 MB - MOV → MP4 - 18.4% · eta 3 min 12 s - -
- -
-
documents· 2
-
- - PDF - Q3-board-deck.pdf - 14.1 MB - PDF → DOCX - queued - -
-
- - TXT - release-notes-0.3.txt - 6 KB - TXT → PDF - done · 6 KB → 48 KB - -
- -
-
archives· 1
-
- - CBZ - One-Piece-v104.cbz - 186 MB - CBZ → CB7 - queued - -
-
-
- - -
- 2 of 8 done · 2 running · 1 failed - 41% - - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not found - - RTX 5090 · Real-ESRGAN ready - - v0.3.0 -
-
- - - diff --git a/docs/mockups/terminal/05-tui-function-keys.html b/docs/mockups/terminal/05-tui-function-keys.html deleted file mode 100644 index 685e070..0000000 --- a/docs/mockups/terminal/05-tui-function-keys.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - -Filesmith · TUI Function Keys - - - - - - - -
- - -
-
Filesmith
-
convertqueue 8 · 2 running
-
v0.3.0
- - - -
- -
-
-

F1 Convert

- Change format - - 8 files - sort group - next group Tab -
- -
- -
-
╡ Queue 8 files · 4 groups ╞
-
╡ add · stop · del ╞
- - - -
-
ST
NAME
SIZE
ROUTE
PROGRESS
RESULT
-
- -
├─ images (4) ─ active group, 4 selected ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
- -
-
*
OK
IMG_4821.HEIC
3.2 MB
HEIC → WebP
-
[|||||||||||||||| 100%]
-
3.2 MB → 640 KB -80%
-
-
-
-
*
RUN
screenshot-2026-10-03 141522.png
1.8 MB
PNG → WebP
-
[|||||||||| 62%]
-
eta 4 s
-
-
-
-
*
WAIT
hero-banner@2x.png
4.6 MB
PNG → WebP
-
[ 0%]
-
queued, 1st
-
-
-
-
*
ERR
scan_receipt_0091.tiff
22.4 MB
TIFF → WebP
-
[|||| 24%]
-
not converted
-
-
-
-
└ Unsupported TIFF compression (JPEG-in-TIFF, old-style). Re-save as standard TIFF, then retry with r.
-
- -
├─ video (1) ─ other group, not selectable while images is active ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
-
-
RUN
screen-recording-standup.mov
812 MB
MOV → MP4
-
[||| 18.4%]
-
eta 3 min 12 s
-
-
- -
├─ documents (2) ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
-
-
WAIT
Q3-board-deck.pdf
14.1 MB
PDF → DOCX
-
[ 0%]
-
queued
-
-
-
-
OK
release-notes-0.3.txt
6 KB
TXT → PDF
-
[|||||||||||||||| 100%]
-
6 KB → 48 KB
-
-
- -
└─ archives (1) ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
-
-
WAIT
One-Piece-v104.cbz
186 MB
CBZ → CB7
-
[ 0%]
-
queued
-
-
- - - - -
-
╞═ cursor ═ hero-banner@2x.png
-
- fromD:\Design\exports\hero-banner@2x.png - imagePNG · 2880 × 1200 · RGBA · 4.6 MB - writesD:\Design\exports\hero-banner@2x.webp - statequeued, starts when screenshot-2026-10-03 141522.png finishes -
-
- -
╡ ↑↓ move Space mark Tab group F10 menu ╞
-
- - - -
- - -
- Total - [||||||||||||||||||||||||| 41%] - 2/8 done - 2 run - 1 fail - 4 wait - - -
-
- ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found, CBR writing off - - RTX 5090 · Real-ESRGAN ready -
-
- - - -
- - diff --git a/docs/mockups/terminal/06-repl-log.html b/docs/mockups/terminal/06-repl-log.html deleted file mode 100644 index 0b7edb7..0000000 --- a/docs/mockups/terminal/06-repl-log.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - -Filesmith REPL Log - - - - - - -
- - -
-
- - Filesmith -
-
session 14:01:58 · convert · 8 files
-
- - - -
-
- - - - -
- -
-
-
14:01:58#filesmith 0.3.0 · convert: change format · drop files anywhere in this window
-
14:02:11>dropped 8 files, sorted into 4 groups by kind
-
- - -
-
# images · 4 selected · options below
- -
-
14:02:11+IMG_4821.HEIC3.2 MBheic → webp -
-
= 640 KB -80% from 3.2 MB · 0.8 s
-
- -
-
14:02:11+screenshot-2026-10-03 141522.png1.8 MBpng → webp -
-
... 62%eta 4 s
-
- -
-
14:02:11+hero-banner@2x.png4.6 MBpng → webp -
-
· queued, next after screenshot-2026-10-03 141522.png
- -
- -
-
14:02:12!scan_receipt_0091.tiff22.4 MBtiff → webp -
-
! Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
- -
- -
-
# video · 1 not in selection, click this line to switch options
-
-
14:02:11+screen-recording-standup.mov812 MBmov → mp4 -
-
... 18.4%eta 3 min 12 s
-
-
- -
-
-
# documents · 2
-
-
14:02:11+Q3-board-deck.pdf14.1 MBpdf → docx -
-
· queued
-
-
-
14:02:11+release-notes-0.3.txt6 KBtxt → pdf -
-
= 48 KB from 6 KB · 0.3 s
-
-
- -
-
-
# archives · 1
-
-
14:02:11+One-Piece-v104.cbz186 MBcbz → cb7 -
-
· queued
-
-
-
-
14:06:40+drop more files anywhere, or
-
-
- - -
-
-

images · 4 selected

Each choice rewrites the command below.

-
--to -
- - - - - - - - - - png and tiff are off, some sources already are -
-
-
--quality -
- - - -
-
-
--out -
- - - last used D:\Photos\2026-10\ - Never overwrites. Collisions save as name (converted).webp, then (2). -
-
-
-
- - -
-
-
- $convert     -
- - -
-
-
- - -
- 41%2 of 8 done · 2 running · 1 failed - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not found - RTX 5090 · Real-ESRGAN ready -
-
- - - - diff --git a/docs/mockups/terminal/07-swiss-rules.html b/docs/mockups/terminal/07-swiss-rules.html deleted file mode 100644 index d4803db..0000000 --- a/docs/mockups/terminal/07-swiss-rules.html +++ /dev/null @@ -1,463 +0,0 @@ - - - - - - -Filesmith Swiss Rules - - - - - - -
- -
-
-
- Filesmith -
-
-
RTX 5090 · Real-ESRGAN ready
-
- - - -
-
- - - -
-
-

Convert

-

Change format. Pick one group, choose a target, run it.

-
-
-
8
-
Files4 groups
-
-
-
41%
-
Total2 of 8 done2 running · 1 failed
-
-
- -
-
- - -
-

Images

4 imagesSelected
- -
- 01
HEIC
-
IMG_4821.HEIC3.2 MB
-
HEIC/WEBP
-
−80%3.2 MB → 640 KB
-
- -
-
- -
- 02
PNG
-
screenshot-2026-10-03 141522.png 1.8 MB
-
PNG/WEBP
-
62%ETA 4 s
-
- - -
-
- -
- 03
PNG
-
hero-banner@2x.png4.6 MB
-
PNG/WEBP
-
Queued
-
- - -
-
- -
- 04
TIFF
-
scan_receipt_0091.tiff22.4 MB
-
TIFF/WEBP
-
FailedRetry after fix
-
- -
-
Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
- -
-

Video

1 videoNot in selection, one group at a time
-
- 05
MOV
-
screen-recording-standup.mov 812 MB
-
MOV/MP4
-
18.4%ETA 3 min 12 s
-
- - -
-
-
- -
-

Documents

2 documents
-
- 06
PDF
-
Q3-board-deck.pdf14.1 MB
-
PDF/DOCX
-
Queued
-
- - -
-
-
- 07
TXT
-
release-notes-0.3.txt6 KB
-
TXT/PDF
-
Done6 KB → 48 KB
-
- -
-
-
- -
-

Archives

1 archive
-
- 08
CBZ
-
One-Piece-v104.cbz186 MB
-
CBZ/CB7
-
Queued
-
- - -
-
-
-
- - -
- -
-
2 of 8 done2 running1 failed
-
- ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found - v0.3.0 -
- -
-
- - diff --git a/docs/mockups/terminal/08-geist-breadcrumb.html b/docs/mockups/terminal/08-geist-breadcrumb.html deleted file mode 100644 index 4468543..0000000 --- a/docs/mockups/terminal/08-geist-breadcrumb.html +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - -Filesmith · Geist Breadcrumb - - - - - - - - -
- -
-
Filesmith
-
-
Ctrl K jump to anything
- - - -
- -
- - - - -
-
-
- / - / - - 8 files -
-
-
-

Convert

-

Change format

-
-
- - -
-
-
- -
- - - -
IMAGES · 4Selected group · options on the right
-
- - -
IMG_4821.HEIC
3.2 MB
-
HEIC→WEBP
-
3.2 MB → 640 KB-80%
-
-
-
- - -
screenshot-2026-10-03 141522.png
1.8 MB
-
PNG→WEBP
-
62%ETA 4 s
-
-
-
- - -
hero-banner@2x.png
4.6 MB
-
PNG→WEBP
-
Queued
-
-
-
- - -
scan_receipt_0091.tiff
22.4 MBUnsupported TIFF compression (JPEG-in-TIFF, old-style)
-
TIFF→WEBP
-
Failed
-
-
- - -
VIDEO · 1Separate group, select to edit
-
- - MOV -
screen-recording-standup.mov
812 MB
-
MOV→MP4
-
18.4%ETA 3 min 12 s
-
-
- - -
DOCUMENTS · 2
-
- - PDF -
Q3-board-deck.pdf
14.1 MB
-
PDF→DOCX
-
Queued
-
-
-
- - TXT -
release-notes-0.3.txt
6 KB
-
TXT→PDF
-
6 KB → 48 KB
-
-
- - -
ARCHIVES · 1
-
- - CBZ -
One-Piece-v104.cbz
186 MB
-
CBZ→CB7
-
Queued
-
- - -
-
-
- - - -
- - -
- 2 of 8 done · 2 running · 1 failed - - 41% - - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08 - Rar.exe not found - - - RTX 5090 · Real-ESRGAN ready -
-
- - diff --git a/docs/mockups/terminal/09-explorer-tree.html b/docs/mockups/terminal/09-explorer-tree.html deleted file mode 100644 index 2cc3cec..0000000 --- a/docs/mockups/terminal/09-explorer-tree.html +++ /dev/null @@ -1,535 +0,0 @@ - - - - - -Filesmith, Explorer Tree - - - - - - -
- - -
-
-
- Filesmith -
- - -
- - - -
-
- -
- - - - -
-
-
-
- - - - - -
-
- Convert - Change format - images - 8 files in Convert · 4 images here -
- -
-
1# Images · 4 selected
-
2# sources: heic ×1, png ×2, tiff ×1 · 32.0 MB total
-
3
-
4target:
-
5format:
-
6
-
7# png, tiff off: a selected file is already that format
-
8quality:
-
9
-
10
-
11output:
-
12folder: #
-
13# e.g. D:\Photos\2026-10\IMG_4821.webp
-
14naming: never-overwrite
-
15# collisions save as name (converted).webp, then name (converted) (2).webp
-
16
-
17inputs:
-
18- IMG_4821.HEIC3.2 MBheic → webpdone 3.2 MB → 640 KB -80%
-
19- screenshot-2026-10-03 141522.png1.8 MBpng → webprunning 62% eta 4 s
-
20- hero-banner@2x.png4.6 MBpng → webpqueued
-
21- scan_receipt_0091.tiff22.4 MBtiff → webpfailed
-
22# Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
- -
- heic, png, tiff → webp · balanced · next to source - - -
-
- - - -
- - -
-
- - - - - - -
-
-
14:22:03imagesIMG_4821.HEIC → IMG_4821.webpdone · 3.2 MB → 640 KB (-80%) · magick
-
14:22:04documentsrelease-notes-0.3.txt → .pdfdone · 6 KB → 48 KB · mutool
-
14:22:06imagesscan_receipt_0091.tifffailed · Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
14:22:07videoscreen-recording-standup.mov → .mp4running 18.4% · 812 MB · eta 3 min 12 s · ffmpeg
-
14:22:09imagesscreenshot-2026-10-03 141522.png → .webprunning 62% · eta 4 s · magick
-
14:22:09queuedhero-banner@2x.png, Q3-board-deck.pdf, One-Piece-v104.cbzpng → webp, pdf → docx, cbz → cb7 · 204.7 MB
-
-
-
-
- - -
- 2 of 8 done · 2 running · 1 failed - 41% - - ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found - RTX 5090 · Real-ESRGAN ready -
-
- - diff --git a/docs/mockups/terminal/10-powerline-status.html b/docs/mockups/terminal/10-powerline-status.html deleted file mode 100644 index 6b8dd30..0000000 --- a/docs/mockups/terminal/10-powerline-status.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - -Filesmith Powerline - - - - - - -
- - -
-
- - Filesmith -
-
- - - -
- - -
-
-
-

Convert

- Change format - 8 files -
- - - -
-
-

Images

4 images · 4 selected - Esc close options -
- -
-
- fFormat -
- - - - - - - - - - png, tiff: some sources already are -
-
-
- qQuality -
- - - -
-
-
- oOutput -
- - - last used D:\Photos\2026-10\ -
-
-
- Never overwrites. Collisions save as name (converted).webp, then (2). - Ctrl Enter convert 4 images -
-
- -
- heic -
IMG_4821.HEIC3.2 MB · heic → webp
-
3.2 MB → 640 KB -80%
-
-
-
- png -
screenshot-2026-10-03 141522.png1.8 MB · png → webp
-
62% · 4 s
-
-
-
- png -
hero-banner@2x.png4.6 MB · png → webp
-
queued
-
- -
-
- tiff -
scan_receipt_0091.tiff22.4 MB · tiff → webp
-
failed
-
-
E: Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
- -
-

Video

1 videoother group, select with Tab
-
- mov -
screen-recording-standup.mov812 MB · mov → mp4
-
18.4% · 3 min 12 s
-
-
-
- -
-

Documents

2 documents
-
- pdf -
Q3-board-deck.pdf14.1 MB · pdf → docx
-
queued
-
-
-
- txt -
release-notes-0.3.txt6 KB · txt → pdf
-
6 KB → 48 KB +700%
-
-
-
- -
-

Archives

1 archive
-
- cbz -
One-Piece-v104.cbz186 MB · cbz → cb7
-
queued
-
-
-
-
-
- - - - - -
-
: command? keysTab next group
- -
-
- -
ffmpeg 7.1magick 7.1.1mutool 1.247z 24.08rar.exe ✗ not found, cbr off
- -
RTX 5090 · real-esrgan ready
- -
v0.3.0
-
-
- - diff --git a/docs/mockups/terminal/11-bottom-dock.html b/docs/mockups/terminal/11-bottom-dock.html deleted file mode 100644 index ba6748f..0000000 --- a/docs/mockups/terminal/11-bottom-dock.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - -Filesmith Bottom Dock - - - - - - -
- - -
-
- - Filesmith -
-
/convert
-
- 1–7 switch mode   Ctrl K commands -
- - - -
-
- - -
-
-
-

Convert

-

Change format

-
8 files
-
- - - -
-
Images4 images4 selected · options active
- -
-
-
IMG_4821.HEIC
HEIC → WebP3.2 MB
-
-80%
3.2 MB → 640 KB
-
-
- -
-
-
screenshot-2026-10-03 141522.png
PNG → WebP1.8 MB
-
62%
ETA 4 s
-
-
-
- -
-
-
hero-banner@2x.png
PNG → WebP4.6 MB
-
queued
#3 in line
-
-
- -
-
-
scan_receipt_0091.tiff
TIFF → WebP22.4 MBUnsupported TIFF compression (JPEG-in-TIFF, old-style)
-
failed
retry R
-
-
- -
Video1 videoShift+click to switch group
-
-
MOV
-
screen-recording-standup.mov
MOV → MP4812 MB
-
18.4%
ETA 3 min 12 s
-
-
-
- -
Documents2 documents
-
-
PDF
-
Q3-board-deck.pdf
PDF → DOCX14.1 MB
-
queued
#4 in line
-
-
-
-
TXT
-
release-notes-0.3.txt
TXT → PDF6 KB
-
done
6 KB → 48 KB
-
- -
- -
Archives1 archive
-
-
CBZ
-
One-Piece-v104.cbz
CBZ → CB7186 MB
-
queued
#5 in line
-
-
-
-
- - - -
- - -
- 2 of 8 done · 2 running · 1 failed - - 41% -
- ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08 - Rar.exe not found - - RTX 5090 · Real-ESRGAN ready - - v0.3.0 -
-
- - - -
- - diff --git a/docs/mockups/terminal/12-verb-tint.html b/docs/mockups/terminal/12-verb-tint.html deleted file mode 100644 index 4dfed91..0000000 --- a/docs/mockups/terminal/12-verb-tint.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - -Filesmith Verb Tint - - - - - - - - -
- - -
-
- - Filesmith -
-
- ~/queue · 8 files - - - -
- - - - - -
-
Images4 selected
- -
- to -
- - - - - - - - - -
-
- -
- quality -
- - - -
-
- -
- out - -
- - - -
- - -
-
- - or drop anywhere in the window - - Never overwrites. Collisions save as name (converted).webp, then (2). -
- - - -
- -
Images4 images4 of 4 selected
- -
- heic - IMG_4821.HEIC - HEIC→WebP - 3.2 MB - done - 3.2 MB → 640 KB -80% - -
- -
- png - screenshot-2026-10-03 141522.png - PNG→WebP - 1.8 MB - 62% - eta 4 s - -
- -
- png - hero-banner@2x.png - PNG→WebP - 4.6 MB - queued - - -
- -
- tiff - scan_receipt_0091.tiff - TIFF→WebP - 22.4 MB - failed - Unsupported TIFF compression (JPEG-in-TIFF, old-style) - -
- - -
Video1 videoselect group to edit options
-
- mov - screen-recording-standup.mov - MOV→MP4 - 812 MB - 18.4% - eta 3 min 12 s - -
- - -
Documents2 documents
-
- pdf - Q3-board-deck.pdf - PDF→DOCX - 14.1 MB - queued - - -
-
- txt - release-notes-0.3.txt - TXT→PDF - 6 KB - done - 6 KB → 48 KB - - -
- - -
Archives1 archive
-
- cbz - One-Piece-v104.cbz - CBZ→CB7 - 186 MB - queued - - -
-
- - -
-
logengine output, newest first
-
-
14:22:11magickscreenshot-2026-10-03 141522.png → .webp q=82 62%
-
14:22:09magickerror scan_receipt_0091.tiff: Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
14:22:07magickok IMG_4821.HEIC → IMG_4821.webp 3.2 MB → 640 KB 1.4 s
-
14:21:40ffmpegscreen-recording-standup.mov → .mp4 libx264 crf 23 frame=3311 fps=58 18.4%
-
14:20:55mutoolok release-notes-0.3.txt → release-notes-0.3.pdf 6 KB → 48 KB 0.3 s
-
-
-
- - -
- 2 of 8 done · 2 running · 1 failed - 41% - -
- ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08 - Rar.exe not found - RTX 5090 · Real-ESRGAN ready -
-
-
- - diff --git a/docs/mockups/terminal/13-one-bit.html b/docs/mockups/terminal/13-one-bit.html deleted file mode 100644 index 79a29fe..0000000 --- a/docs/mockups/terminal/13-one-bit.html +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - -Filesmith One Bit - - - - - - -
- -
-
Filesmith
-
convert/queue/images
-
-
CommandCtrl K
-
- - - -
-
- -
- - -
-
-

Convert

- Change format -
-
-
files8
-
groups4
-
in1.04 GB
-
-
- -
-
-
- Files - 8 files in 4 groups - - - -
- - - -
- -
- - Images4 images - Selected -
-
- HEIC - IMG_4821.HEIC3.2 MB - HEIC→WEBP - OK640 KB-80% - -
-
- PNG - screenshot-2026-10-03 141522.png1.8 MB - PNG→WEBP - 62%4 s - -
-
- PNG - hero-banner@2x.png4.6 MB - PNG→WEBP - Queued - -
-
- TIFF - scan_receipt_0091.tiff22.4 MB - TIFF→WEBP - Errfailed - - Unsupported TIFF compression (JPEG-in-TIFF, old-style) -
- - -
- - Video1 video - other group, select to switch -
-
- MOV - screen-recording-standup.mov812 MB - MOV→MP4 - 18.4%3 min 12 s - -
- -
- - Documents2 documents -
-
- PDF - Q3-board-deck.pdf14.1 MB - PDF→DOCX - Queued - -
-
- TXT - release-notes-0.3.txt6 KB - TXT→PDF - OK6 KB → 48 KB - -
- -
- - Archives1 archive -
-
- CBZ - One-Piece-v104.cbz186 MB - CBZ→CB7 - Queued - -
-
- -
-
Loglast 6 events
-
-
14:21:58doneIMG_4821.HEIC → IMG_4821.webp, 640 KB
-
14:22:03donerelease-notes-0.3.txt → release-notes-0.3.pdf, 48 KB
-
14:22:05errorscan_receipt_0091.tiff: Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
14:22:06startscreenshot-2026-10-03 141522.png with ImageMagick 7.1.1
-
14:22:06startscreen-recording-standup.mov with ffmpeg 7.1 (libx264, crf 23)
-
14:22:11waithero-banner@2x.png, Q3-board-deck.pdf, One-Piece-v104.cbz
-
>
-
-
-
- - -
-
-
- -
-
- 2 of 8 done2 running1 failed - - 41% -
-
-
- ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found, no CBR - RTX 5090 · Real-ESRGAN ready -
-
-
- - diff --git a/docs/mockups/terminal/14-serif-contrast.html b/docs/mockups/terminal/14-serif-contrast.html deleted file mode 100644 index 8302e1c..0000000 --- a/docs/mockups/terminal/14-serif-contrast.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - - -Filesmith Serif Contrast - - - - - - -
- - -
-
Filesmith
-
convert / images, video, documents, archives
-
- - - -
-
- -
- - - - - -
-
-
-

Convert

-

Change format, 8 files in the queue

-
- -
- -
- - -
-

Images

4 images
-
-
-
-
IMG_4821.HEIC
HEIC → WebP  ·  3.2 MB
-
Done3.2 MB → 640 KB
-
-80%
-
-
-
-
-
screenshot-2026-10-03 141522.png
PNG → WebP  ·  1.8 MB
-
Running 62%About 4 s left
-
-
-
-
-
-
-
hero-banner@2x.png
PNG → WebP  ·  4.6 MB
-
QueuedNext in line
-
-
-
-
-
-
scan_receipt_0091.tiff
TIFF → WebP  ·  22.4 MB
Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
FailedRetry or remove
-
-
-
-
-
- - -
-

Video

1 video
-
-
-
MOV
-
screen-recording-standup.mov
MOV → MP4  ·  812 MB
-
Running 18.4%About 3 min 12 s left
-
-
-
-
-
-
- - -
-

Documents

2 documents
-
-
-
PDF
-
Q3-board-deck.pdf
PDF → DOCX  ·  14.1 MB
-
QueuedAfter images
-
-
-
-
-
TXT
-
release-notes-0.3.txt
TXT → PDF  ·  6 KB
-
Done6 KB → 48 KB
-
+700%
-
-
-
-
- - -
-

Archives

1 archive
-
-
-
CBZ
-
One-Piece-v104.cbz
CBZ → CB7  ·  186 MB
-
QueuedAfter documents
-
-
-
-
-
- -
-
- - - -
- - -
- 2 of 8 done, 2 running, 1 failed - - 41% - - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not foundRTX 5090, Real-ESRGAN ready -
-
- - diff --git a/docs/mockups/terminal/15-spreadsheet-grid.html b/docs/mockups/terminal/15-spreadsheet-grid.html deleted file mode 100644 index 61ba51a..0000000 --- a/docs/mockups/terminal/15-spreadsheet-grid.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - -Filesmith Spreadsheet Grid - - - - - - -
- - -
-
- - Filesmith -
-

Convert

Change format8 files
-
-
- - - -
-
- - -
- -
fx
-
- =CONVERT(A1:A4, "webp", "balanced", "next-to-source") -
-
evaluates to 4 jobs · 32.0 MB in · est. 6.4 MB out
-
- -
- -
-
-
-
A
-
B name
-
C size
-
D route
-
E status
-
F progress
-
G result
-
H
-
- - -
-
-
Images4 imagesactive groupHEIC, PNG, TIFF
-
- -
-
-
1
-
HEIC
-
IMG_4821.HEIC
-
3.2 MB
-
HEIC → WebP
-
done
-
100%
-
3.2 MB → 640 KB −80%
-
-
-
-
2
-
PNG
-
screenshot-2026-10-03 141522.png
-
1.8 MB
-
PNG → WebP
-
running
-
62%
-
ETA 4 s
-
-
-
-
3
-
PNG
-
hero-banner@2x.png
-
4.6 MB
-
PNG → WebP
-
queued
-
0%
-
waiting
-
-
-
-
4
-
TIFF
-
scan_receipt_0091.tiff
-
22.4 MB
-
TIFF → WebP
-
#ERR
-
–
-
-
-
- -
- - -
-
-
Video1 videoOther convert group, click its header to switch
-
-
-
5
-
MOV
-
screen-recording-standup.mov
-
812 MB
-
MOV → MP4
-
running
-
18.4%
-
ETA 3 min 12 s
-
-
- - -
-
-
Documents2 documents
-
-
-
6
-
PDF
-
Q3-board-deck.pdf
-
14.1 MB
-
PDF → DOCX
-
queued
-
0%
-
waiting
-
-
-
-
7
-
TXT
-
release-notes-0.3.txt
-
6 KB
-
TXT → PDF
-
done
-
100%
-
6 KB → 48 KB
-
-
- - -
-
-
Archives1 archiveCBR output needs Rar.exe
-
-
-
8
-
CBZ
-
One-Piece-v104.cbz
-
186 MB
-
CBZ → CB7
-
queued
-
0%
-
waiting
-
-
- - -
-
9
- -
- -
- - -
-

E4 · #ERR

-

Unsupported TIFF compression (JPEG-in-TIFF, old-style). Re-save the scan as a standard TIFF or PNG, then retry.

-
-
- - - -
- - - - - -
-
Running
-
2 of 8 done · 2 running · 1 failed41%
-
Selection count 4sum 32.0 MB
-
ffmpeg 7.1·ImageMagick 7.1.1·mutool 1.24·7-Zip 24.08·Rar.exe not found
-
0.3.0
-
-
- - - diff --git a/docs/mockups/terminal/16-warp-blocks.html b/docs/mockups/terminal/16-warp-blocks.html deleted file mode 100644 index 60d9844..0000000 --- a/docs/mockups/terminal/16-warp-blocks.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - -Filesmith Warp Blocks - - - - - - -
- - -
-
Filesmith
- ~/convert - - - - -
- -
- - - - -
-
-

Convert

- Change format - - 8 files · 4 blocks - - -
- -
-
- - -
- -
-
✓HEICIMG_4821.HEICHEIC → WebP3.2 MB - 3.2 MB → 640 KB -80% -
-
▸PNGscreenshot-2026-10-03 141522.pngPNG → WebP1.8 MB - 62%eta 4 s -
-
·PNGhero-banner@2x.pngPNG → WebP4.6 MB - queued -
-
✕TIFFscan_receipt_0091.tiffTIFF → WebP22.4 MB - failed - -
! Unsupported TIFF compression (JPEG-in-TIFF, old-style) · re-save as standard TIFF and retry
-
-
1/4 done · 1 running · 1 failed62% · eta 4 s
-
- - -
- -
-
▸MOVscreen-recording-standup.movMOV → MP4812 MB - 18.4%eta 3 min 12 s -
-
-
0/1 done · 1 running18% · eta 3 min 12 sclick header to select block
-
- - -
- -
-
·PDFQ3-board-deck.pdfPDF → DOCX14.1 MB - queued -
-
✓TXTrelease-notes-0.3.txtTXT → PDF6 KB - 6 KB → 48 KB -
-
-
1/2 done50%
-
- - -
- -
-
·CBZOne-Piece-v104.cbzCBZ → CB7186 MB - queued -
-
-
0/1 done · waiting
-
-
- - - -
- - -
- +add filesdrop anywhere, or browseCtrl O -
- - -
- 41% - 2 of 8 done · 2 running · 1 failed - - ffmpeg 7.1 - ImageMagick 7.1.1 - mutool 1.24 - 7-Zip 24.08 - Rar.exe not found - RTX 5090 · Real-ESRGAN ready -
-
-
-
- - diff --git a/docs/mockups/terminal/17-linear-triptych.html b/docs/mockups/terminal/17-linear-triptych.html deleted file mode 100644 index 0432f74..0000000 --- a/docs/mockups/terminal/17-linear-triptych.html +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - -Filesmith · Linear Preview - - - - - - - - -
- -
-
- - Filesmith -
-
/Convert/IMG_4821.HEIC
-
- - - - -
- -
- - - - -
-
-

Convert 8 files

-

Change format

-
- - -
- - -
- -
IMG_4821.HEIC
-
HEIC → WebP3.2 MB → 640 KB
-
-80%
-
- -
- -
screenshot-2026-10-03 141522.png
-
PNG → WebP1.8 MBETA 4 s
-
62%
-
- -
- -
hero-banner@2x.png
-
PNG → WebP4.6 MBqueued
-
-
- -
- -
scan_receipt_0091.tiff
-
22.4 MBUnsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
- - -
- -
screen-recording-standup.mov
-
MOV → MP4812 MBETA 3m 12s
-
18.4%
-
- - -
- -
Q3-board-deck.pdf
-
PDF → DOCX14.1 MBqueued
-
-
-
- -
release-notes-0.3.txt
-
TXT → PDF6 KB → 48 KB
-
done
-
- - -
- -
One-Piece-v104.cbz
-
CBZ → CB7186 MBqueued
-
-
-
- -
- JK move - X select - Space preview - -
-
- - -
-
- - IMG_4821.HEIC - HEIC → WebP -
- - - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
Before HEIC 3.2 MB
-
After WebP 640 KB
-
4032 × 3024 · 12.2 MP
-
-80% · saved 2.56 MB
-
-
- -
- queued14:02:11 - 0.4 s - running14:02:11.4 - 3.6 s - done14:02:15 - - 4.0 s total -
- -
-
-

Images · 4 selected

- HEIC, PNG ×2, TIFF -
- options apply to this group only -
- -
-
Target format
-
- - - - - - - - - -
-
QualityWebP q82
-
- -
-
- -
-
Output
-
-
Next to source D:\Photos\2026-10\
-
- -

Never overwrites. Collisions save as name (converted).webp, then (2).

-
- -
- 1 done, 1 running, 1 queued, 1 failed · ≈ 1.4 MB out -
- - -
-
-
-
- - -
- 41% - 2 of 8 done · 2 running · 1 failed - - - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08 - Rar.exe not found, CBR off - RTX 5090 · Real-ESRGAN ready - -
-
- - diff --git a/docs/mockups/terminal/18-pipeline-board.html b/docs/mockups/terminal/18-pipeline-board.html deleted file mode 100644 index a99ab50..0000000 --- a/docs/mockups/terminal/18-pipeline-board.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - -Filesmith Pipeline Board - - - - - - -
- - -
-
- - Filesmith -
-
convert/board
-
- - - -
-
- -
- - - - -
-
-
-

Convert

-

Change format

-
-
- 8 files · 4 groups -
- - -
-
- -
-
Queued3
-
Running2
-
Done2
-
Failed1
-
-
- -
or drop anywhere on the board · files sort into lanes by kind
-
- -
- -
- -
-
-
queued1
-
-
PNGPNG → WebP4.6 MB -
- hero-banner@2x.png -
queuednext up
-
-
-
-
running1
-
-
PNGPNG → WebP1.8 MB -
- screenshot-2026-10-03 141522.png -
-
62%ETA 4 s
-
-
-
-
done1
-
-
HEICHEIC → WebP3.2 MB
- IMG_4821.HEIC -
3.2 MB → 640 KB-80%
-
-
-
-
failed1
-
-
TIFFTIFF → WebP22.4 MB
- scan_receipt_0091.tiff -
Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
-
-
-
- - -
- -
-
queued0
-
running1
MOVscreen-recording-standup.mov812 MB18.4% · 3:12
-
done0
-
failed0
-
-
- -
- -
-
queued1
PDFQ3-board-deck.pdf14.1 MBPDF → DOCX
-
running0
-
done1
TXTrelease-notes-0.3.txt6 KB → 48 KBTXT → PDF
-
failed0
-
-
- -
- -
-
queued1
CBZOne-Piece-v104.cbz186 MBCBZ → CB7
-
running0
-
done0
-
failed0
-
-
-
- -
-
Engine log
-
14:21:58magickIMG_4821.HEIC start heic → webp -quality 82
-
14:22:07magickIMG_4821.HEIC → IMG_4821.webp 640 KB 0.9 s
-
14:22:08mutoolrelease-notes-0.3.txt → release-notes-0.3.pdf 48 KB 0.2 s
-
14:22:09magickscan_receipt_0091.tiff: Unsupported TIFF compression (JPEG-in-TIFF, old-style)
-
14:22:11ffmpegscreen-recording-standup.mov frame=3312 fps=118 time=00:00:55.20 speed=3.9x
-
-
- - - -
- - -
- 2 of 8 done · 2 running · 1 failed - - 41% - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not found - - RTX 5090 · Real-ESRGAN ready -
-
- - diff --git a/docs/mockups/terminal/19-amber-manpage.html b/docs/mockups/terminal/19-amber-manpage.html deleted file mode 100644 index 978e132..0000000 --- a/docs/mockups/terminal/19-amber-manpage.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - - - -Filesmith Amber Manpage - - - - - - -
- -
-
- - Filesmith man convert -
-
-
- - - -
-
- - - -
- - -
-
-

NAME

-

convert - change file format

-
- -
-

SYNOPSIS

-
-
- $ filesmith convert -t webp -q balanced -o next-to-source IMG_4821.HEIC screenshot-2026-10-03… +2 - -
-
- - 8 files in queue, 4 images selected -
-
-
- -
-

OPTIONS for Images · 4 selected

-
-
-
-t, --to FORMAT
-
-
- - - - - - - - - -
- png, tiff off: a selected source is already that format. -
-
- -
-
-q, --quality LEVEL
-
-
- - - -
-
-
- -
-
-o, --out DIR
-
- Next to source (default)   -
-
- -
-
--no-clobber always on
-
Never overwrites. Collisions save as name (converted).webp, then (2).
-
-
-
- -
-

FILES

- -
-

Images (4) selected · active group

-
- HEIC -
IMG_4821.HEIC
-
heic → webp 3.2M → 640K -80% done
-
- - -
-
-
- PNG -
screenshot-2026-10-03 141522.png
-
png → webp 1.8M 62% eta 4s
-
- - -
-
-
- PNG -
hero-banner@2x.png
-
png → webp 4.6M queued
-
- - -
-
-
- TIFF -
scan_receipt_0091.tiff
-
tiff → webp 22.4M ERR unsupported tiff compression (JPEG-in-TIFF, old-style)
-
- - -
-
-
- -
-

Video (1) other group, not in selection

-
- MOV -
screen-recording-standup.mov
-
mov → mp4 812M 18.4% eta 3m 12s
-
- - -
-
-
- -
-

Documents (2)

-
- PDF -
Q3-board-deck.pdf
-
pdf → docx 14.1M queued
-
- - -
-
-
- TXT -
release-notes-0.3.txt
-
txt → pdf 6K → 48K done
-
- -
-
-
- -
-

Archives (1)

-
- CBZ -
One-Piece-v104.cbz
-
cbz → cb7 186M queued
-
- - -
-
-
-

Options describe one group at a time. Select a row in another group to switch.

-
-
- - -
- -
- Filesmith 0.3.0 -
- 2026-10-04 - - 41% 2 of 8 done · 2 running · 1 failed -
- CONVERT(1) -
-
- - diff --git a/docs/mockups/terminal/20-hud-metrics.html b/docs/mockups/terminal/20-hud-metrics.html deleted file mode 100644 index c638383..0000000 --- a/docs/mockups/terminal/20-hud-metrics.html +++ /dev/null @@ -1,450 +0,0 @@ - - - - - -Filesmith HUD Metrics - - - - - - -
- - -
-
-
- Filesmith -
-
convert · 2 running · 38 MB/s
-
- - - -
-
- -
- - - -
- -
-

Convert

- Change format - 8 files - - -
- - -
-
-
Progressoverall
-
41%
-
-
0ETA 3 min 14 s100
-
-
-
Done
-
2/ 8
-
-
2 run1 fail3 queued
-
-
-
Throughputlast 60 s · peak 51
-
38MB/s
- -
-
-
GPUAI tools
-
RTX 5090
-
- Real-ESRGANready - rembgready - VRAM1.2 / 32 GB · idle -
-
-
- - -
-
-
filesizeroutestatusspeed · progress
- -
Images4 imagesselected1 done · 1 running · 1 failed
-
-
-
- IMG_4821.HEIC3.2 MB - HEIC → WebPdone - 3.2 MB → 640 KB-80% - -
-
-
- screenshot-2026-10-03 141522.png1.8 MB - PNG → WebPrunning - ⣀⣤⣶⣿⣷⣶⣾⣿⣶⣴62%4 s - - -
-
-
- hero-banner@2x.png4.6 MB - PNG → WebPqueued - next - -
-
-
TIF
- scan_receipt_0091.tiff22.4 MB - TIFF → WebPfailed - Unsupported TIFF compression (JPEG-in-TIFF, old-style) - -
-
- -
Video1 videorunning
-
-
-
MOV
- screen-recording-standup.mov812 MB - MOV → MP4running - ⣶⣶⣤⣤⣶⣶⣶⣤⣴⣶18.4%3 min 12 s - - -
-
- -
Documents2 documents1 done
-
-
-
PDF
- Q3-board-deck.pdf14.1 MB - PDF → DOCXqueued - waiting - -
-
-
TXT
- release-notes-0.3.txt6 KB - TXT → PDFdone - 6 KB → 48 KB - -
-
- -
Archives1 archivequeued
-
-
-
CBZ
- One-Piece-v104.cbz186 MB - CBZ → CB7queued - waiting - - -
-
-
end of queueR retry failedSpace pause allTab next group
-
- - - -
-
-
- - -
- 2 of 8 done · 2 running · 1 failed - - ffmpeg 7.1ImageMagick 7.1.1mutool 1.247-Zip 24.08Rar.exe not found · CBR writing off - -
-
- - diff --git a/docs/mockups/terminal/index.html b/docs/mockups/terminal/index.html deleted file mode 100644 index d84336f..0000000 --- a/docs/mockups/terminal/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - -Filesmith Terminal Mockups - - - -
-

filesmith / terminal redesign / 20 mockups

-

dark only. click a card to open the mockup.

-
-
- -
Wind Native mockup
-
01Wind Native

The safe bet: Filesmith rebuilt on Wind's exact settings DNA, so the two apps feel like siblings.

-
- -
Wind Dense Inspector mockup
-
02Wind Dense Inspector

Wind's tokens tightened into a pro-tool table with a fixed right inspector, for people who want to see 40 rows at once.

-
- -
Tmux Panes mockup
-
03Tmux Panes

The window is a tmux session: three hard-split panes and a green status line, with real GUI controls inside each pane.

-
- -
Command First mockup
-
04Command First

No sidebar at all: a big command bar owns the top of the window and every verb is one keystroke away, Raycast for files.

-
- -
TUI Function Keys mockup
-
05TUI Function Keys

An htop or Midnight Commander homage drawn with box characters, with a F-key bar along the bottom for every verb.

-
- -
REPL Log mockup
-
06REPL Log

The app is a scrolling session log with a prompt at the bottom; every drop, option and result is a line you can read back.

-
- -
Swiss Rules mockup
-
07Swiss Rules

Brutalist Swiss: heavy white rules, a condensed display face and verbs as top tabs, black and white only.

-
- -
Geist Breadcrumb mockup
-
08Geist Breadcrumb

Vercel-grade black and white precision: icon rail, breadcrumb header, a flat borderless queue and card-stacked options, very little ornament.

-
- -
Explorer Tree mockup
-
09Explorer Tree

A VS Code-style explorer where verbs are folders, convert groups are subfolders and the options panel reads like a config file.

-
- -
Powerline Status mockup
-
10Powerline Status

Vim modal energy without the box lines: an airy, borderless workspace where a bold powerline bar at the bottom carries all global state.

-
- -
Bottom Dock mockup
-
11Bottom Dock

Verbs live in a bottom mode dock like a DAW or a camera app, leaving the full height for the queue and options.

-
- -
Verb Tint mockup
-
12Verb Tint

No sidebar and no side panel: verbs as quiet top tabs, options as one toolbar strip, and each verb owns a whisper of colour on hairlines and progress.

-
- -
One Bit mockup
-
13One Bit

A 1-bit, pixel-precise system: pixel-font headings, dithered progress and nothing but pure white on pure black.

-
- -
Serif Contrast mockup
-
14Serif Contrast

An editorial calm take: a sharp serif title against mono data, spacious rows, almost a printed job sheet in the dark.

-
- -
Spreadsheet Grid mockup
-
15Spreadsheet Grid

The queue is a spreadsheet: column letters, row numbers, cell selection and a formula bar that shows the job as a function.

-
- -
Warp Blocks mockup
-
16Warp Blocks

Each convert group is a command block like Warp terminal: a header command, live output rows, and a block you select as a unit.

-
- -
Linear Preview mockup
-
17Linear Preview

Preview-first, Linear-style: a narrow keyboard-driven list on the left and a dominant inspector that shows the focused file big, with the group's options beneath.

-
- -
Pipeline Board mockup
-
18Pipeline Board

Status columns instead of a list: queued, running, done and failed lanes with groups as swimlanes, readable at a glance.

-
- -
Amber Manpage mockup
-
19Amber Manpage

Each verb is a man page: one centred document with NAME, SYNOPSIS, OPTIONS and FILES sections, warm paper-white text with amber only on headings and flags.

-
- -
HUD Metrics mockup
-
20HUD Metrics

A status-first HUD: the top third is live metrics with braille sparklines, the queue sits beneath as a quiet list.

-
-
- - diff --git a/docs/mockups/terminal/shots/01-wind-native.png b/docs/mockups/terminal/shots/01-wind-native.png deleted file mode 100644 index 9f7187e..0000000 Binary files a/docs/mockups/terminal/shots/01-wind-native.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/02-wind-dense-inspector.png b/docs/mockups/terminal/shots/02-wind-dense-inspector.png deleted file mode 100644 index 8648467..0000000 Binary files a/docs/mockups/terminal/shots/02-wind-dense-inspector.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/03-tmux-panes.png b/docs/mockups/terminal/shots/03-tmux-panes.png deleted file mode 100644 index ce5ede0..0000000 Binary files a/docs/mockups/terminal/shots/03-tmux-panes.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/04-command-first.png b/docs/mockups/terminal/shots/04-command-first.png deleted file mode 100644 index 8184524..0000000 Binary files a/docs/mockups/terminal/shots/04-command-first.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/05-tui-function-keys.png b/docs/mockups/terminal/shots/05-tui-function-keys.png deleted file mode 100644 index 77d7090..0000000 Binary files a/docs/mockups/terminal/shots/05-tui-function-keys.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/06-repl-log.png b/docs/mockups/terminal/shots/06-repl-log.png deleted file mode 100644 index d868e30..0000000 Binary files a/docs/mockups/terminal/shots/06-repl-log.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/07-swiss-rules.png b/docs/mockups/terminal/shots/07-swiss-rules.png deleted file mode 100644 index d1e4a8d..0000000 Binary files a/docs/mockups/terminal/shots/07-swiss-rules.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/08-geist-breadcrumb.png b/docs/mockups/terminal/shots/08-geist-breadcrumb.png deleted file mode 100644 index e514087..0000000 Binary files a/docs/mockups/terminal/shots/08-geist-breadcrumb.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/09-explorer-tree.png b/docs/mockups/terminal/shots/09-explorer-tree.png deleted file mode 100644 index deb5a1c..0000000 Binary files a/docs/mockups/terminal/shots/09-explorer-tree.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/10-powerline-status.png b/docs/mockups/terminal/shots/10-powerline-status.png deleted file mode 100644 index f0ce2b6..0000000 Binary files a/docs/mockups/terminal/shots/10-powerline-status.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/11-bottom-dock.png b/docs/mockups/terminal/shots/11-bottom-dock.png deleted file mode 100644 index 3a1cc82..0000000 Binary files a/docs/mockups/terminal/shots/11-bottom-dock.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/12-verb-tint.png b/docs/mockups/terminal/shots/12-verb-tint.png deleted file mode 100644 index 3b193e9..0000000 Binary files a/docs/mockups/terminal/shots/12-verb-tint.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/13-one-bit.png b/docs/mockups/terminal/shots/13-one-bit.png deleted file mode 100644 index da0fabc..0000000 Binary files a/docs/mockups/terminal/shots/13-one-bit.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/14-serif-contrast.png b/docs/mockups/terminal/shots/14-serif-contrast.png deleted file mode 100644 index da3feb1..0000000 Binary files a/docs/mockups/terminal/shots/14-serif-contrast.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/15-spreadsheet-grid.png b/docs/mockups/terminal/shots/15-spreadsheet-grid.png deleted file mode 100644 index 544eac0..0000000 Binary files a/docs/mockups/terminal/shots/15-spreadsheet-grid.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/16-warp-blocks.png b/docs/mockups/terminal/shots/16-warp-blocks.png deleted file mode 100644 index 89ba96e..0000000 Binary files a/docs/mockups/terminal/shots/16-warp-blocks.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/17-linear-triptych.png b/docs/mockups/terminal/shots/17-linear-triptych.png deleted file mode 100644 index b71e1d6..0000000 Binary files a/docs/mockups/terminal/shots/17-linear-triptych.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/18-pipeline-board.png b/docs/mockups/terminal/shots/18-pipeline-board.png deleted file mode 100644 index 4f3922a..0000000 Binary files a/docs/mockups/terminal/shots/18-pipeline-board.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/19-amber-manpage.png b/docs/mockups/terminal/shots/19-amber-manpage.png deleted file mode 100644 index 52d614b..0000000 Binary files a/docs/mockups/terminal/shots/19-amber-manpage.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/20-hud-metrics.png b/docs/mockups/terminal/shots/20-hud-metrics.png deleted file mode 100644 index 76263e0..0000000 Binary files a/docs/mockups/terminal/shots/20-hud-metrics.png and /dev/null differ diff --git a/docs/mockups/terminal/shots/_index.png b/docs/mockups/terminal/shots/_index.png deleted file mode 100644 index 513387d..0000000 Binary files a/docs/mockups/terminal/shots/_index.png and /dev/null differ diff --git a/docs/mockups/view-zoom/01-steps-with-toast.html b/docs/mockups/view-zoom/01-steps-with-toast.html deleted file mode 100644 index e4bbdb6..0000000 --- a/docs/mockups/view-zoom/01-steps-with-toast.html +++ /dev/null @@ -1,645 +0,0 @@ - - - - - - -Filesmith View Zoom - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - -
-
- -
- 9 files, 1 selected - -
-
- - - -
-
-
-
name
-
kind
-
size
-
result
-
status
-
- -
-
-
-
9 files
-
-
380 MB
-
214 MB41 MBso far
-
3 of 9 done
-
-
List
-
-
- - -
- - - - diff --git a/docs/mockups/view-zoom/02-slider-in-toolbar.html b/docs/mockups/view-zoom/02-slider-in-toolbar.html deleted file mode 100644 index 0da4cb3..0000000 --- a/docs/mockups/view-zoom/02-slider-in-toolbar.html +++ /dev/null @@ -1,592 +0,0 @@ - - - - - - -Filesmith View Zoom Slider - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - -
-
- -
- 9 files, 1 selected -
- - -
- -
- -
-
-
- -
- -
-
-
-
- - -
- - - - diff --git a/docs/mockups/view-zoom/03-list-grid-toggle-plus-zoom.html b/docs/mockups/view-zoom/03-list-grid-toggle-plus-zoom.html deleted file mode 100644 index 98ade6f..0000000 --- a/docs/mockups/view-zoom/03-list-grid-toggle-plus-zoom.html +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - -Filesmith View Zoom - - - - - - - - - -
-
Filesmith
- - -
- - - -
-
- -
- - -
-
- -
- 9 files, 1 selected -
- - list 2/3 - -
-
-
- - -
-
-
-
- -
-
-
-
- - -
- - - - diff --git a/docs/mockups/view-zoom/index.html b/docs/mockups/view-zoom/index.html deleted file mode 100644 index 79a9649..0000000 --- a/docs/mockups/view-zoom/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -View Zoom Mockups - - - -

Filesmith view zoom

-

Four concepts for resizing the files view. Each screenshot opens the live mockup at that size: hold Ctrl and scroll inside the files view (or Ctrl+= / Ctrl+-, Ctrl+0 resets).

-

01 Steps with toast

Five fixed steps from compact list to large grid; a brief toast names the size, a view dropdown at the toolbar end sets it without a wheel.

02 Slider in toolbar

A list-to-grid slider with a size label sits in the files toolbar and always shows the current size; Ctrl+wheel snaps it between six stops.

03 List/Grid toggle plus zoom

A List/Grid segmented toggle picks the mode; Ctrl+wheel changes density inside it (3 list sizes, 3 grid sizes) with a -/+ readout.

04 Explorer style

Sizes named like Windows File Explorer (Details, Tiles, Medium, Large, Extra large icons) in a View menu with Ctrl+Shift+1..5.

- - diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-menu.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-menu.png deleted file mode 100644 index 01ed266..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-menu.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-size0.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-size0.png deleted file mode 100644 index be40490..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-size0.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-size1.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-size1.png deleted file mode 100644 index 48c56e4..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-size1.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-size2.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-size2.png deleted file mode 100644 index 52805f7..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-size2.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-size3.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-size3.png deleted file mode 100644 index 82ac274..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-size3.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/01-steps-with-toast-size4.png b/docs/mockups/view-zoom/shots/01-steps-with-toast-size4.png deleted file mode 100644 index 95a4441..0000000 Binary files a/docs/mockups/view-zoom/shots/01-steps-with-toast-size4.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size0.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size0.png deleted file mode 100644 index bf0f216..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size0.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size1.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size1.png deleted file mode 100644 index 3275743..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size1.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size2.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size2.png deleted file mode 100644 index 681beb3..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size2.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size3.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size3.png deleted file mode 100644 index cbfe17b..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size3.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size4.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size4.png deleted file mode 100644 index 119af1d..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size4.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size5.png b/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size5.png deleted file mode 100644 index 4e1bead..0000000 Binary files a/docs/mockups/view-zoom/shots/02-slider-in-toolbar-size5.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size0.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size0.png deleted file mode 100644 index db81f6c..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size0.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size1.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size1.png deleted file mode 100644 index 710aadc..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size1.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size2.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size2.png deleted file mode 100644 index a68f795..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size2.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size3.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size3.png deleted file mode 100644 index 0279aff..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size3.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size4.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size4.png deleted file mode 100644 index c8ba178..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size4.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size5.png b/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size5.png deleted file mode 100644 index 83f1bb1..0000000 Binary files a/docs/mockups/view-zoom/shots/03-list-grid-toggle-plus-zoom-size5.png and /dev/null differ diff --git a/docs/mockups/view-zoom/shots/_index.png b/docs/mockups/view-zoom/shots/_index.png deleted file mode 100644 index cb8f02c..0000000 Binary files a/docs/mockups/view-zoom/shots/_index.png and /dev/null differ diff --git a/docs/models.md b/docs/models.md new file mode 100644 index 0000000..0e5776b --- /dev/null +++ b/docs/models.md @@ -0,0 +1,289 @@ +# Models + +Filesmith uses three kinds of AI model. None of them is baked into the app, so you can add your own. + +| Kind | Used by | Where the files live | +| ----------------------- | ---------------- | ------------------------------------------------------------- | +| Real-ESRGAN (ncnn) | Upscale | Bundled, plus `%APPDATA%\Filesmith\models\realesrgan` | +| ComfyUI upscale models | Upscale (NVIDIA) | Your ComfyUI `models\upscale_models`, read in place | +| Image generation models | Generate | Your ComfyUI `models\checkpoints`, `diffusion_models`, `unet` | + +All of Filesmith's own data lives in `%APPDATA%\Filesmith`. Your ComfyUI folder is only read, except +for one case: **Download required files** on Generate writes text encoders and VAEs into it. + +## Point Filesmith at ComfyUI + +Generate and the Upscale AI models both read one remembered ComfyUI folder. Filesmith guesses common +locations (your profile, Documents, OneDrive, drive roots, names like `ComfyUI`, +`ComfyUI_windows_portable`, `StabilityMatrix`, plus ComfyUI Desktop's settings in +`%APPDATA%\ComfyUI`). If the guess misses, set it yourself. Any of these works: + +- **Settings > Tools > ComfyUI folder > Choose folder** (or **Change folder**). +- **Generate**, with no model found: **Choose ComfyUI folder**. +- **Generate > Your models > Change ComfyUI folder**. +- **Generate**, when ComfyUI was not found: **Locate my ComfyUI folder**. +- **Upscale > AI models > ComfyUI models**: **Locate my ComfyUI folder** or **Browse to ComfyUI folder** + (**Change ComfyUI folder** or **Change folder** once one is set). +- CLI: `filesmith setup comfy --folder "D:\ComfyUI"`. + +You can pick the ComfyUI root, its `models` folder or its `upscale_models` folder. The choice is stored +in `%APPDATA%\Filesmith\comfy-upscalers.json`. One pick fixes Generate, Upscale and the companion +downloads at once. + +## Upscale + +The **Model** picker on Upscale lists the Real-ESRGAN models on disk, then **AI models** when an NVIDIA +GPU that can run CUDA is present. If a GPU is too old for it, the picker says why. + +### Add a Real-ESRGAN model + +1. Upscale > **Add your own model**, or **Settings > Tools > Upscale models > Open folder**. Both open + `%APPDATA%\Filesmith\models\realesrgan`. +2. Drop in an ncnn model pair: `name.param` and `name.bin`. A `.param` without its `.bin` is ignored. +3. Reopen the Upscale picker. Your model shows as `Name, added by you`. A bundled model with the same + name wins. + +### Use your ComfyUI upscale models + +Filesmith loads the ESRGAN-family files in ComfyUI's `upscale_models` (4x-UltraSharp, Remacri, NMKD, +AnimeSharp, RealESRGAN and similar) with spandrel, the loader ComfyUI itself uses. ComfyUI does not +need to be running and no workflow is involved. Files are referenced in place, never copied. + +1. Upscale > Model > **AI models**. The **ComfyUI models** card appears below. +2. If the card says **Set up upscale engine**, the engine needs Python with torch and spandrel: + - If your ComfyUI's own Python already has both, nothing is downloaded. Use **Locate my ComfyUI + folder** so Filesmith can find it. + - Otherwise **Set up upscale engine** builds a shared env in `%APPDATA%\Filesmith\pid`, about 3 GB. + PiD uses the same env, so if PiD is installed setup is quick. +3. Choose **Browse to ComfyUI folder** (or **Change folder**). Filesmith scans: + - `upscale_models` under the folder you picked, at the usual nesting depths, + - extra `upscale_models` paths from `extra_model_paths.yaml`, if present. +4. Pick a model in the second **AI model** list. Each shows its native scale, for example + `4x-UltraSharp, 4×`. Use **Rescan** after adding or removing files. + +The scan opens `.pth`, `.safetensors` and `.ckpt`. It skips `.pt`, because spandrel loads `.pt` without +the restricted unpickler, and a scan touches every file in the folder. + +Each file gets a badge: + +- **Verified**: spandrel read a known architecture (ESRGAN, RealESRGAN, SPAN, DAT, HAT, SwinIR, Compact, + PLKSR and others), or the name matches a well-known model. +- **Experimental**: spandrel loaded it but the architecture is not on the list. Still fully usable; the + picker adds `, experimental` to the label. +- **Unsupported**: spandrel could not load it (diffusion checkpoints, LoRAs, VAEs, unknown formats). + These are listed under "N files not usable" with the reason. + +Upscaling is tiled, so any image size fits in VRAM. Alpha is restored after the RGB pass. A model you +remove from disk drops out of the picker on the next check. + +PiD (a separate diffusion upscaler) also sits under AI models. It is offered once installed, or when +its weights are found in your ComfyUI and can be reused. + +## Generate + +Generate runs text-to-image through ComfyUI over its HTTP API. Filesmith connects to a running ComfyUI +(`FILESMITH_COMFY_URL`, a stored server URL, then `http://127.0.0.1:8188`), or launches your ComfyUI +headless on a free port with its own Python. Filesmith never installs ComfyUI. + +### Which models show up + +Filesmith scans every ComfyUI models folder it knows: + +- `checkpoints`: single-file checkpoints (`.safetensors`, `.ckpt`, `.sft`). +- `diffusion_models` and `unet`: bare diffusion models (`.safetensors`, `.sft`, `.gguf`). + +Each file's header is read (not the weights) to find its family. Built-in families: SDXL and +single-file checkpoints, Flux 1, Flux 2 [klein], Z-Image Turbo and Krea 2. Video, 3D and audio models +are dropped. An unrecognized image model is shown with a reason and a **Try anyway** button, which runs +it through a generic graph. + +### When there is no model + +If the scan finds nothing, the Model section shows **No image model yet** with two buttons: + +- **Choose ComfyUI folder**: point Filesmith at a ComfyUI that has models. +- **Add a model**: import a registry entry or a ComfyUI workflow (see below). + +### Missing text encoders or VAE + +A model that needs files you do not have shows **Required files**, with each file and its size. +**Download required files** fetches them into the same ComfyUI models tree the model lives in +(`text_encoders`, `vae` and so on). Disk space is checked first. Downloads are sha256-checked when the +registry has a hash. The CLI equivalent is `filesmith setup generate --model `. + +## Add a generation model (the model registry) + +What a model family is (how to recognize it, which files it needs, which ComfyUI graph runs it) is +data in JSON files, so a new family needs no app release. + +### Where the registry lives + +Three layers, merged by `id`. Later layers win field by field. + +| Layer | Path | Written by | +| ----------- | -------------------------------------- | ---------------------------------- | +| 1. Built-in | `\resources\registry\*.json` | the installer, read-only | +| 2. Channel | `%APPDATA%\Filesmith\registry\channel` | signed network updates (off today) | +| 3. Yours | `%APPDATA%\Filesmith\registry\user` | you | + +- An app update replaces layer 1 only. Your layer 3 files survive every update. +- Layer 1 ships in the installer, so an offline install has the full catalog. +- Open your folder from **Settings > Tools > Model registry > Open folder**, or **Generate > Your + models > Open folder**. Edits are picked up the next time Generate checks, no restart needed. + +### Easiest: import a ComfyUI workflow + +If a model already works in ComfyUI: + +1. In ComfyUI, export the workflow in API format (**Workflow > Export (API)**). +2. In Filesmith, **Generate > Add a model** and pick that `.json`. + +Filesmith turns it into a registry entry named after the file. It wires these inputs to placeholders: +the model loader (`UNETLoader`, `UnetLoaderGGUF` or `CheckpointLoaderSimple`), `VAELoader`, +`CLIPLoader`/`DualCLIPLoader`, the first `CLIPTextEncode` (prompt) and the second (negative), +`EmptyLatentImage`/`EmptySD3LatentImage` (size, batch), `KSampler` seed and steps, and `SaveImage`. +Sampler defaults are copied from the exported `KSampler`. A note tells you what it could not wire. +The file is saved in your user layer under a new name; an existing file is never replaced. + +**Add a model** also accepts a registry entry or a pack (`{ "schemaVersion": 1, "entries": [...] }`). + +### Quick fix: a download URL went dead + +When a Hugging Face repo moves, override just that field. Save this as +`%APPDATA%\Filesmith\registry\user\fix-flux2.json`: + +```json +{ + "schemaVersion": 1, + "entries": [ + { + "id": "flux2", + "kind": "generate", + "label": "Flux 2 [klein]", + "provenance": { "source": "user" }, + "companionSets": [ + { + "id": "4b", + "companions": [ + { + "role": "clip", + "label": "Qwen3-4B text encoder", + "subdir": "text_encoders", + "identify": { "nameHint": "qwen_3_4b" }, + "download": { + "filename": "qwen_3_4b.safetensors", + "approxSize": "8 GB", + "urls": ["https://huggingface.co//qwen_3_4b.safetensors"] + } + } + ] + } + ] + } + ] +} +``` + +Everything else about `flux2` (graph, sampler, required nodes) comes from the built-in entry. + +### Full entry: a new architecture + +Start from a copy of an entry in `resources\registry\gen-archs.json`. A generate entry has: + +- **`detect`**: how to recognize the file from its contents, used only for files the built-in + classifier could not place. + + ```json + "detect": { + "tensorKeys": { "all": ["cap_embedder", "noise_refiner"], "none": ["double_blocks"] }, + "metaArch": ["z-image", "zimage"], + "sizeBytesRange": [4000000000, 14000000000], + "nameHint": "z.?image" + } + ``` + + Tensor keys match as substrings in the safetensors header. `all` must all be present, `any` needs + one, `none` rejects. `nameHint` scores far below content and never outvotes it. + +- **`capabilities`**: `{ "task": "text-to-image", "minDim": 256, "maxDim": 2048, "dimStep": 8 }`. +- **`sampler`**: the defaults the UI fills in. A distilled or turbo model needs `"cfg": 1`. + + ```json + "sampler": { "name": "res_multistep", "scheduler": "simple", "steps": 8, "cfg": 1, "guidance": 0, "hasGuidance": false } + ``` + +- **`requires`**: ComfyUI nodes, checked against the live server before anything is queued, so a + missing node gives a clear message. + + ```json + "requires": { + "nodes": ["CLIPTextEncode", "KSampler", "VAEDecode", "SaveImage"], + "clipLoader": { "node": "CLIPLoader", "type": "lumina2" }, + "minComfyNote": "This needs ComfyUI v0.6.0 or newer." + } + ``` + +- **`companions`** or **`companionSets`**: the encoder and VAE files, with download URLs. +- **`workflow`**: a ComfyUI API-format graph, `{ "format": "comfy-api-v1", "template": { ... } }`. Use + `workflow` for a bare diffusion model, `checkpointWorkflow` for a single-file checkpoint and + `ggufWorkflow` for a GGUF. An entry can have several. + +Placeholders: + +`${unet}` `${clip}` `${clip2}` `${vae}` `${model}` `${prompt}` `${negative}` `${seed}` `${steps}` +`${cfg}` `${guidance}` `${sampler}` `${scheduler}` `${width}` `${height}` `${batch}` `${prefix}` + +A value that is exactly one placeholder gets the raw value, so `"seed": "${seed}"` becomes a number. + +### What gets rejected + +Entries are validated at load. A bad entry is skipped with a warning and the rest keeps working. + +- `subdir` must be one of `text_encoders`, `clip`, `vae`, `checkpoints`, `diffusion_models`, `unet`, + `upscale_models`. It is joined onto your ComfyUI models folder, so anything else is a path risk. +- `filename` may only use letters, digits, `.`, `_` and `-`. +- Download URLs must be `https:`. +- A workflow must be `{class_type, inputs}` nodes and use only the placeholders above. +- Workflows are data: parsed as JSON, never run as code, and only sent to a local ComfyUI. +- An entry with a newer `schemaVersion` than your Filesmith is skipped with a note to update. + +To see registry warnings, run `filesmith doctor`. + +## For the maintainer + +### Keeping shipped hashes current + +Every download in `resources\registry\gen-archs.json` has a `sha256` and a URL pinned to a commit, with +the `resolve/main` URL after it as a fallback. Hugging Face LFS object ids are the sha256 of the file. + +``` +node scripts/registry-hashes.mjs # refresh hashes and pins from upstream +node scripts/registry-hashes.mjs --check # fails if the pack is stale (for CI) +``` + +The hash is not enforced against the fallback URL, because the branch copy may legitimately differ. +A fallback uses trust-on-first-use. A gated or renamed repo is left as is and reported. + +### Publishing a channel update + +The channel lets a signed pack fix dead URLs on every install without a release. It is off until a +signing key exists: `CHANNEL_PUBLIC_KEY_B64` in `src\main\registry\channel.ts` is empty. + +To turn it on, once: + +``` +node scripts/registry-channel.mjs keygen +``` + +This writes `channel-private.pem` (gitignored; back it up, losing it means no install accepts another +update) and prints the public key for `CHANNEL_PUBLIC_KEY_B64`. Then, whenever something moves: + +``` +node scripts/registry-hashes.mjs +node scripts/registry-channel.mjs sign resources/registry/gen-archs.json +node scripts/registry-channel.mjs verify channel.json +``` + +Publish `channel.json` at the URL in `FILESMITH_CHANNEL_URL` (a GitHub Pages file is enough). Installs +check at most once a day in the background. A bad signature, a malformed pack or no network keeps the +previous cache. diff --git a/docs/operations.md b/docs/operations.md new file mode 100644 index 0000000..4c86d0f --- /dev/null +++ b/docs/operations.md @@ -0,0 +1,197 @@ +# Operations + +What each verb in the rail does: what it accepts, the options in the inspector's +Options tab, their defaults, and what it writes. Labels below match the UI. + +## Output naming (all verbs) + +Filesmith never overwrites a source or an existing file. + +- A file is written next to its source as `name.` when that name is free. +- If it is taken, a tag is added: `name (converted).ext`, then `name (converted 2).ext`, and so on. + The tag is the verb: `converted`, `compressed`, `resized`, `upscaled`, `no-bg`, `text`, + `pages`, `merged`. +- Operations that produce many files write a new folder, such as `name (pages)`, with + `name (pages) (2)` on a clash. +- A failed or canceled job leaves nothing behind. +- Every verb except Generate shows a size estimate card under its options once files are queued. + +## Convert + +Changes format. Works within a family; a file is never offered its own format. A selection +never mixes two families, and the target list only shows formats valid for every selected file. + +| Source | Targets | Engine | +| ----------------------------------------------- | ---------------------------------------------- | -------------- | +| Image | PNG, JPG, WebP, AVIF, JXL, TIFF, BMP, GIF, ICO | ImageMagick | +| Video | MP4, MKV, MOV, WebM, AVI, GIF | ffmpeg | +| Audio | MP3, M4A, AAC, OGG, OPUS, FLAC, WAV | ffmpeg | +| Word doc, plain text, PDF | PDF, DOCX, ODT, RTF, TXT, HTML | LibreOffice | +| PDF (extra) | CBZ, CBR, CB7, CBT | mutool + 7-Zip | +| Spreadsheet (xlsx, xls, ods, csv, tsv) | PDF, XLSX, ODS, CSV | LibreOffice | +| Slides (pptx, ppt, odp) | PDF, PPTX, ODP | LibreOffice | +| Archive (zip, rar, 7z, tar, cbz, cbr, cb7, cbt) | CBZ, CBR, CB7, CBT, ZIP, RAR, 7Z, TAR, PDF | 7-Zip | + +Routing notes: + +- PDF to TXT uses mutool and does not need LibreOffice. +- Other document conversions use the LibreOffice copy bundled with the app. If it is missing, + Filesmith falls back to an installed LibreOffice + (`winget install TheDocumentFoundation.LibreOffice`). +- Archive to archive is extract and repack. Archive to PDF puts the images in filename + order, the way a reader shows them. +- PDF to a comic format renders each page to an image, then packs them. +- CBR and RAR output need WinRAR (`Rar.exe`), which cannot be bundled. Without it, those + targets are greyed out with "WinRAR not found". Reading RAR needs nothing extra. +- Images going to JPG or BMP are flattened onto white. ICO gets sizes 256 to 16. + +Options: + +| Option | Shown for | Choices | Default | +| -------------- | ----------------------- | --------------------------------------------- | -------------------------------------------- | +| Format | all | targets above | WebP for images, else the first valid target | +| Quality | images | smaller, balanced, best | balanced | +| Compression | archive to archive | store, normal | store | +| Resolution | PDF to comic | 72 to 400 dpi | 150 dpi | +| Page format | PDF to comic | jpg, png | jpg | +| Page quality | PDF to comic, jpg pages | 10 to 100 | 100 | +| Location | non-archive converts | next to source, chosen folder (Choose folder) | next to source | +| If file exists | non-archive converts | add (2), the only choice | add (2) | + +Output: one file per source in the target format, tag `converted`. + +## Compress + +Shrinks file size. Accepts images (JPG, PNG, WebP, GIF, TIFF, AVIF, JXL), video, audio and PDF. +BMP, HEIC, SVG and other formats that cannot be re-encoded safely are not offered. + +| Kind | Option | Choices | Default | +| ----- | ------- | ------------------------------------------ | ----------- | +| Image | Format | Keep format, WebP, AVIF | Keep format | +| Image | Quality | 10 to 100 | 80 | +| Video | Codec | H.264, H.265, AV1 | H.264 | +| Video | Scale | 25% to original, step 5 | original | +| Video | Quality | 10 to 100 | 80 | +| Audio | Codec | Keep format, MP3, AAC, Opus | Keep format | +| Audio | Bitrate | 320k, 256k, 192k, 128k, 96k, 64k | 192k | +| PDF | Level | Lossless, High quality, Balanced, Smallest | Balanced | +| PDF | Colour | Convert to greyscale (checkbox) | off | + +Output, tag `compressed`: + +- Image: same format via CaesiumCLT (or ImageMagick for formats Caesium cannot write), or + WebP/AVIF via ImageMagick. +- Video: always `.mp4` (ffmpeg). All audio tracks are kept; subtitles are dropped. Below + original scale the inspector lists each file's exact output pixels. +- Audio: the chosen codec's extension. Keep format on a lossless source (FLAC, WAV, AIFF) + writes a max-compression FLAC. +- PDF: Lossless runs `mutool clean` (no image changes). Other levels use Ghostscript, which + downsamples embedded images. + +## Resize + +Scales images with ImageMagick. Accepts images. Animated GIFs keep their frames. + +| Option | Choices | Default | +| ---------------- | ---------------------------------------------- | ----------- | +| Mode | percent, dimensions | percent | +| Percent | 5% to 200% | 50% | +| Width and height | numbers; leave one blank to scale by the other | blank | +| Fit | keep aspect, stretch | keep aspect | + +Keep aspect fits inside the box, so one of the two numbers may have no effect; the output +size list shows the real result per file. Stretch uses both numbers. + +Output: same format as the source, tag `resized`. + +## Upscale + +Enlarges images 2x to 4x with AI. Accepts images. Output is always PNG, tag `upscaled`. + +| Option | Choices | Default | +| -------- | ---------------------------------------------------------- | -------------------- | +| Factor | 2×, 3×, 4× | 4× | +| Model | Real-ESRGAN models found on disk, plus AI models on NVIDIA | Photo | +| AI model | imported ComfyUI upscalers, PiD (diffusion), 4× | first imported model | +| GPU mode | full GPU usage, balanced | full GPU usage | + +Engines: + +- **Real-ESRGAN (ncnn, Vulkan).** Bundled and works on any Vulkan GPU, including AMD and + Intel. The Model list is read from disk: Photo, Anime and any other shipped models, plus + your own. **Add your own model** opens the user models folder; drop in a `.param`/`.bin` + pair and it appears, marked "added by you". +- **AI models (NVIDIA only).** Shown when an NVIDIA GPU is detected; otherwise the inspector + says why. Opens a second picker: + - **ComfyUI upscalers.** Choose your ComfyUI folder once; Filesmith reads + `models\upscale_models` in place (nothing copied, ComfyUI does not need to run) and loads + each file with spandrel. Each entry shows its native scale; unverified ones say + "experimental". See [models.md](models.md). + - **PiD (diffusion).** Offered only when installed or when its weights can be reused from + your ComfyUI. The **PiD engine** card downloads about 6 GB once (non-commercial use only); + **PiD install** removes it. PiD has no GPU mode. Under 12 GB of VRAM it warns that large + images are reduced to fit. +- **GPU mode.** Balanced caps VRAM and paces the work so other apps stay responsive. + +The output size list shows each file's result. Outputs over about 1 GB trigger a warning. + +## Remove BG + +Cuts the subject out with rembg (BiRefNet model, alpha matting and mask clean-up always on). +Accepts images. Needs the free `uv` tool (`winget install astral-sh.uv`); the first run +downloads the model once (a few hundred MB), then works offline. + +| Option | Choices | Default | +| ---------------- | ------------------------------------------------------------------- | ----------- | +| Fill | Transparent, White, Black, Green screen, Custom Color, Custom Image | Transparent | +| Custom colour | colour picker (Custom Color) | `#ff0000` | +| Background image | Choose image (Custom Image) | none | + +Output: PNG, tag `no-bg`. Custom Image composites the cutout over the chosen image. + +## Generate + +Creates images from a text prompt with your local ComfyUI. Takes no dropped files; the prompt +is typed in the centre. Filesmith attaches to a running ComfyUI or starts its own headless one. +If ComfyUI is not found, a COMFYUI group asks you to locate it. + +| Option | Choices | Default | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------- | +| Model | image models in your ComfyUI folder | first runnable model | +| Negative prompt | text (hidden for models that ignore it) | `blurry, low quality, watermark, text` | +| Style | none, realistic, photographic, anime, artsy, 3d render, fantasy | none | +| Size | Square 1:1 · 1024, Portrait 2:3, Landscape 3:2, Portrait 9:16, Landscape 16:9, Portrait 4:5, Landscape 5:4, custom | Square 1:1 · 1024 | +| Count | 1 to 8 | 1 | +| Steps (Advanced) | 1 to 50 (8 to 50 for SDXL, Flux 1) | per model family | +| Guidance (CFG) (Advanced, SDXL) | 1 to 15 | 7 | +| Guidance (Advanced, Flux) | 1 to 10 | 3.5 for Flux 1 | +| Seed (Advanced) | number, or Random seed | random | + +Model setup: + +- **Your models** lists the folder, with **Add a model** (import a ComfyUI "Export (API)" + workflow), **Open folder** and **Change ComfyUI folder**. +- A model missing its text encoder or VAE shows **Required files** with + **Download required files**. +- An unrecognised model can be run with **Try anyway**. +- Changing to a different model family resets Steps and Guidance to that family's defaults. + +Output: PNG named from the start of the prompt (`a-red-fox.png`, tag `generated`), saved to +your Downloads folder. + +![Generate with a model picked and an empty prompt](screenshots/generate.png) + +## PDF Tools + +A grid of one-off PDF cards. Each card is one operation and accepts PDFs. + +| Card | Does | Options (default) | Output | +| -------------- | ------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------- | +| Extract text | Saves the text layer | none | `name.txt` (tag `text`) | +| Pages to PNG | Renders each page | Resolution, 72 to 400 dpi (150 dpi) | folder `name (pages)` with `page-1.png`, ... | +| Merge | Combines 2+ PDFs in table order | none; needs 2 or more PDFs | one PDF named after the first (tag `merged`) | +| Split | Keeps only the listed pages | Pages to keep, e.g. `1-3,5,8-10` (empty) | `name (pages).pdf` | +| Burst | Saves every page separately | none | folder `name (split)` with `name-1.pdf`, ... (zero-padded to the page count's digits) | +| Extract images | Pulls out embedded images | none | folder `name (images)`; fails if the PDF has none | + +All cards use mutool, which is bundled. diff --git a/docs/screenshots/console.png b/docs/screenshots/console.png new file mode 100644 index 0000000..8d0fbce Binary files /dev/null and b/docs/screenshots/console.png differ diff --git a/docs/screenshots/convert.png b/docs/screenshots/convert.png new file mode 100644 index 0000000..feef2a1 Binary files /dev/null and b/docs/screenshots/convert.png differ diff --git a/docs/screenshots/generate.png b/docs/screenshots/generate.png index 8ce7cdf..0c866dc 100644 Binary files a/docs/screenshots/generate.png and b/docs/screenshots/generate.png differ diff --git a/docs/screenshots/image-preview.png b/docs/screenshots/image-preview.png deleted file mode 100644 index 6706243..0000000 Binary files a/docs/screenshots/image-preview.png and /dev/null differ diff --git a/docs/screenshots/queue.png b/docs/screenshots/queue.png deleted file mode 100644 index 1092beb..0000000 Binary files a/docs/screenshots/queue.png and /dev/null differ diff --git a/docs/screenshots/settings.png b/docs/screenshots/settings.png new file mode 100644 index 0000000..a1f0edc Binary files /dev/null and b/docs/screenshots/settings.png differ diff --git a/docs/screenshots/upscale.png b/docs/screenshots/upscale.png deleted file mode 100644 index c623e9f..0000000 Binary files a/docs/screenshots/upscale.png and /dev/null differ diff --git a/docs/screenshots/view-large-icons.png b/docs/screenshots/view-large-icons.png new file mode 100644 index 0000000..388c587 Binary files /dev/null and b/docs/screenshots/view-large-icons.png differ diff --git a/docs/screenshots/viewer.png b/docs/screenshots/viewer.png deleted file mode 100644 index aa496cd..0000000 Binary files a/docs/screenshots/viewer.png and /dev/null differ diff --git a/docs/upscaler-upgrade-plan.md b/docs/upscaler-upgrade-plan.md deleted file mode 100644 index b19d6fb..0000000 --- a/docs/upscaler-upgrade-plan.md +++ /dev/null @@ -1,118 +0,0 @@ -> **STATUS: SUPERSEDED (2026-08).** The ONNX/DirectML "Standard" tier described -> below was never built. What shipped instead is the spandrel/ComfyUI import -> path — see `docs/comfyui-upscaler-import.md`. Kept for the decision record. - -# Image Upscale v2: PiD flagship + cross-GPU ONNX engine - -Status: APPROVED 2026-07-21. Order: PiD first, then ONNX Standard tier, then custom import. - -## Goal - -Level up the "Image Upscale" tool beyond the current Real-ESRGAN (ncnn-vulkan) baseline, in -three tiers: - -1. **Standard (any GPU)** — the shippable upgrade for every user. -2. **Advanced (NVIDIA) / PiD** — the flagship, for the dev's own RTX machine. Not shippable. -3. **Custom import** — user-supplied `.onnx` models (UltraSharp-class), license burden on the user. - -## Why these choices (from the research brief) - -- **PiD** = NVIDIA Pixel Diffusion. Best-in-class restoration, but weights are NVIDIA - non-commercial (NSCLv1), NVIDIA-CUDA only, and it needs the torch/diffusers diffusion stack. - So it can never ship in the product; it lives as a gated, opt-in, download-on-first-use tier - the user runs on their own hardware. Verified: `nv-tlabs/PiD` provides STANDALONE inference - (no ComfyUI) via torch+diffusers. -- **ONNX Runtime + DirectML** (`onnxruntime-node`) is the shippable engine: one model format, - accelerates on NVIDIA/AMD/Intel via DirectML, CPU fallback, NO Python/torch in the installer - (torch used only at build time to export `.onnx`), and reaches the transformer SR tier that - ncnn cannot. -- The famous community models (UltraSharp, Remacri, AnimeSharp) are CC-BY-NC-SA - (non-commercial). Never bundled; offered via custom import. -- Delivery: download-on-first-use for all models (keep the installer lean). Import accepts - pre-converted `.onnx` only (no on-device `.pth` converter). - -## Tiers and models - -| Tier | Engine | Runs on | Models | Ships? | -| ----------------- | ------------------------------------ | ---------------------- | -------------------------------------------------------------------- | ----------- | -| Standard | ONNX + DirectML (`onnxruntime-node`) | NVIDIA/AMD/Intel + CPU | Real-ESRGAN (default), NMKD-Superscale, one transformer (SwinIR/DAT) | yes | -| Advanced (NVIDIA) | torch + diffusers via uv/Python | NVIDIA CUDA only | PiD (backbone VAE: flux/sd3) | no (opt-in) | -| Custom | ONNX + DirectML | any | user `.onnx` from OpenModelDB | n/a | - -Cross-cutting: **tiling with OOM back-off** (halve tile on allocator error, retry) so one build -survives an 8GB laptop GPU, CPU fallback, and the RTX 5090. - -## PiD standalone invocation (verified) - -``` -python -m pid._src.inference.from_clean --backbone flux \ - --input_path IMG --scale 4 --pid_inference_steps 4 --output_dir OUT -``` - -Deps: torch (CUDA 12.8 for Blackwell / RTX 5090), transformers>=4.57, diffusers>=0.37, plus the -repo's utility deps. Weights: `nvidia/PiD` checkpoint + a backbone VAE. Code Apache-2.0, weights -non-commercial. - -## Plan (phased) - -### Spike B result (PiD) — DONE 2026-07-21 - -- torch 2.10.0+cu128 installs on Windows and runs on the RTX 5090 (Blackwell sm_120). CUDA OK. -- `nvidia/PiD` is PUBLIC/UNGATED. The backbone VAE (`ae.safetensors`, 320MB) is bundled in that - same repo and read locally, so there is NO runtime download of the gated FLUX/SD3 repos. - => one-click end-user download is viable: one public repo, no HF token, no license gate. -- `from_clean.py --backbone flux --scale 4 --prompt "a photo"` ran standalone (no ComfyUI) and - produced a clean, diffusion-quality 4x (400x267 -> 1600x1024). A `--prompt` is REQUIRED even at - cfg_scale=1 (text-conditioned model). -- Download budget: ~3GB torch env (once) + flux checkpoint 2.6GB + VAE 320MB (per model). -- **SPEED CONCERN:** model load ~19s; the 4-step diffusion DECODE itself took ~7-8 min for one - small image on the 5090 (first run 466s total; a second run exceeded 10 min). This is dominated - by the decode, not loading, and likely by Blackwell PTX/JIT kernel compilation with no - persistent cache + no `--compile`. PiD is inherently a heavy "minutes per image" tool. - Phase 1 MUST: run a resident sidecar (load once), enable `--compile`, persist the CUDA/inductor - cache, and set honest "this takes minutes" UX expectations. Even optimized, PiD is a - best-quality/be-patient tier, not a fast one. Warm per-image time still to be measured properly. - -### Phase 0 — Feasibility spikes (de-risk before building) - -- **Spike A (ONNX):** get `onnxruntime-node` with the DirectML EP running a Real-ESRGAN `.onnx` - on this box; confirm the DML native libs package for Windows-x64 and measure speed. Record the - exact npm package + version that ships DML binaries. -- **Spike B (PiD):** clone `nv-tlabs/PiD`, set up a uv/torch(CUDA12.8)/diffusers env, download a - backbone + PiD checkpoint, run `from_clean.py --scale 4` on a real photo. Confirm it produces a - 4x image on the 5090 and record VRAM/time. This is Phase 1's foundation. - -### Phase 1 — PiD Advanced tier (the flagship) - -- `resolvePid()` / uv env bootstrap (mirror the rembg resolver): pinned torch+cu128, diffusers, - PiD repo installed editable, weights cached under `%LOCALAPPDATA%/Filesmith/pid`. -- `src/main/tools/pidUpscale.ts`: arg builder for `from_clean.py`; pre-convert exotic inputs to - PNG (reuse the magick pre-convert); output PNG; parse progress from stderr. -- Register as an operation/model within the Image Upscale tool, gated: only offered when an - NVIDIA GPU is detected; first selection shows a non-commercial-use notice + download prompt. -- Tiling/size guard: PiD has no built-in tiling; cap input size or tile ourselves, with OOM - back-off. -- Tests: arg builder, gating logic, error messages (no-NVIDIA, download-failed, OOM). - -### Phase 2 — Standard tier (cross-GPU ONNX engine) - -- Add `onnxruntime-node` (DirectML build) as a runtime dependency. -- `src/main/tools/onnxUpscale.ts`: load an `.onnx` SR model, run image->image with tiling + - OOM back-off, EP preference DirectML -> CPU. -- Curated model registry (Real-ESRGAN, NMKD, one transformer) with download-on-first-use into - `%LOCALAPPDATA%/Filesmith/models`, checksum-verified. -- Migrate the Image Upscale model picker to these tiers; keep or retire the ncnn path per Spike A. -- Tests: registry, tiling math, EP fallback, arg/inference wiring via the harness. - -### Phase 3 — Custom import + polish - -- "Import model" (pre-converted `.onnx`): validate it's a loadable SR graph, add to the picker. -- UI polish: tier grouping in the model dropdown, per-model download state, GPU-requirement - messaging for the Advanced tier. - -## Open risks - -- `onnxruntime-node` DirectML packaging on Windows-x64 (Spike A confirms). -- PiD on Blackwell (RTX 5090) needs a very recent torch+CUDA 12.8 build (Spike B confirms). -- PiD backbone VAE weights are large and may themselves be license-gated (flux). Record sizes. -- Big first-run downloads for PiD (torch ~2-3GB + weights) — must be clearly communicated + resumable. diff --git a/package-lock.json b/package-lock.json index 2d70dc1..5e06868 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "filesmith", - "version": "0.8.0", + "version": "0.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "filesmith", - "version": "0.8.0", + "version": "0.8.1", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index e994374..b4ad47c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "filesmith", - "version": "0.8.0", + "version": "0.8.1", "description": "A desktop file toolkit: convert, compress, resize, upscale, remove backgrounds, and PDF tools.", "author": "Max", "license": "MIT", diff --git a/test/no-em-dash.test.ts b/test/no-em-dash.test.ts index 5c5f728..3b2528d 100644 --- a/test/no-em-dash.test.ts +++ b/test/no-em-dash.test.ts @@ -22,6 +22,12 @@ const TARGETS = [ 'resources/skill', 'build/installer/path.nsh', 'docs/cli.md', + 'docs/getting-started.md', + 'docs/operations.md', + 'docs/models.md', + 'docs/architecture.md', + 'docs/mockups/README.md', + 'README.md', 'docs/superpowers/plans/2026-10-04-cli-and-skill.md', 'src/renderer/src/components/queue', 'src/renderer/src/theme/viewsizes.css',