{"type":"desktop-application","id":"org.babelserver.spekter","name":"Spekter","summary":"Instant file and folder comparison","description":"<p>\n      Visual GUI tool for recursive directory and file comparison.\n      Side-by-side and unified diff views with synchronized scrolling,\n      inline character-level highlighting, Meld-style Bezier gutter\n      connectors and a tabbed interface. It follows your light or dark\n      system theme.\n    </p>\n      <p>\n      Binary files are detected and reported with sizes rather than\n      rendered as garbled text. Spekter detects when JSON or JSONL files\n      differ only in element ordering, and applies hunk-slider\n      postprocessing so an inserted object in a JSON array is marked as\n      one whole object.\n    </p>\n      <p>\n      Code and data files are syntax coloured, with grammars for a lot of\n      languages built in and more available as plugins: a plugin is just a\n      folder of Sublime Text grammar files, with no code to install.\n      Colouring is instant.\n    </p>\n      <p>\n      Large files stay responsive: a file's text appears instantly while\n      its diff is computed on a background thread, computed diffs are\n      cached, and the changed files are prefetched as you browse, so\n      opening or revisiting them feels immediate even at a million lines.\n    </p>\n      <p>\n      Ignored entries (.git, node_modules, editor swap files and the\n      like) are skipped but listed as dimmed stubs rather than silently\n      erased, and the rules go both ways: expand an ignored directory or\n      open an ignored file to compare it anyway, or right-click any entry\n      to ignore it yourself. These choices are remembered per directory\n      pair.\n    </p>\n      <p>\n      An instant, keyboard-driven alternative to Meld and diff for\n      comparing folders and code.\n    </p>\n    ","developer_name":"Hallvard Ystad","icon":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/icons/128x128/org.babelserver.spekter.png","icons":[{"url":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/icons/128x128/org.babelserver.spekter.png","width":128,"height":128,"type":"remote"},{"url":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/icons/128x128@2/org.babelserver.spekter.png","width":128,"height":128,"scale":2,"type":"remote"}],"screenshots":[{"sizes":[{"width":"1028","height":"766","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-1_orig.png"},{"width":"752","height":"560","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-1_752x560@1.png"},{"width":"624","height":"464","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-1_624x464@1.png"},{"width":"224","height":"166","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-1_224x166@1.png"}],"caption":"Reordered JSON elements are flagged as moved, not as real changes","default":true},{"sizes":[{"width":"1028","height":"766","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-2_orig.png"},{"width":"752","height":"560","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-2_752x560@1.png"},{"width":"624","height":"464","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-2_624x464@1.png"},{"width":"224","height":"166","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-2_224x166@1.png"}],"caption":"Hide the reordering to see just the genuine differences"},{"sizes":[{"width":"1028","height":"766","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-3_orig.png"},{"width":"752","height":"560","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-3_752x560@1.png"},{"width":"624","height":"464","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-3_624x464@1.png"},{"width":"224","height":"166","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-3_224x166@1.png"}],"caption":"Side-by-side file diff with inline character-level highlighting"},{"sizes":[{"width":"1028","height":"766","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-4_orig.png"},{"width":"752","height":"560","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-4_752x560@1.png"},{"width":"624","height":"464","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-4_624x464@1.png"},{"width":"224","height":"166","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-4_224x166@1.png"}],"caption":"Unified diff view with the same inline highlighting"},{"sizes":[{"width":"1028","height":"766","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-5_orig.png"},{"width":"752","height":"560","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-5_752x560@1.png"},{"width":"624","height":"464","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-5_624x464@1.png"},{"width":"224","height":"166","scale":"1x","src":"https://dl.flathub.org/media/org/babelserver/spekter/05c143c6c724cec43788f0efff29cf30/screenshots/image-5_224x166@1.png"}],"caption":"Recursive directory comparison with several diffs open in tabs"}],"releases":[{"timestamp":"1792108800","version":"1.4.0","type":"stable","description":"<p>Syntax colouring, and an even more instant start</p>\n          <p>New:</p>\n          <ul>\n            <li>Syntax colouring for a lot of languages, extensible with grammar plugins.</li>\n            <li>The \"moved\" pill on a reordered element is now a button: click it to go to the identical element on the other side.</li>\n          </ul>\n          <p>Improvements:</p>\n          <ul>\n            <li>Faster start-up and quicker diffs of large files: now even more instant.</li>\n            <li>Updated to egui 0.37, with a number of smaller fixes in the user interface.</li>\n          </ul>\n        "},{"timestamp":"1786492800","version":"1.3.1","type":"stable","description":"<p>Middle-click paste on Linux, and clearer banners for near-identical files</p>\n          <p>Improvements:</p>\n          <ul>\n            <li>Text selected in the diff views can now be pasted with middle-click in other applications.</li>\n            <li>When two files differ only in their line endings, the banner now says exactly what differs (for example CRLF versus LF), and byte-identical pairs get their own \"Files are identical\" banner.</li>\n            <li>The directory view updates immediately when a visible ignored stub entry is created or removed on disk.</li>\n          </ul>\n          <p>Fixes:</p>\n          <ul>\n            <li>A file lacking a final newline no longer smears its whole tail into one big changed block; only the genuinely changed lines are marked.</li>\n          </ul>\n        "},{"timestamp":"1782950400","version":"1.3.0","type":"stable","description":"<p>Instant large-file diffs, and ignored entries shown honestly</p>\n          <p>Improvements:</p>\n          <ul>\n            <li>Large files are dramatically faster and lighter: two diff algorithms race with the loser cancelled, computed diffs are cached and shared in memory, the changed files visible on screen are prefetched while you browse, and per-diff memory use is roughly halved. Re-opening a large diff is instant.</li>\n            <li>Ignored entries (.git, node_modules, editor swap files and the like) are listed as dimmed stubs instead of being silently erased. Expand an ignored directory or open an ignored file to compare it anyway, right-click any entry to ignore it yourself, and hide the stubs with a header toggle. These choices are remembered per directory pair.</li>\n            <li>The summary line now counts ignored entries, and terminal mode gains --no-ignore to compare everything.</li>\n            <li>New \"Changes only\" toggle for reordered JSON and JSONL: it hides the diff that comes purely from reordering, so only the genuine additions, removals and edits remain on screen. Available in both side-by-side and unified views.</li>\n          </ul>\n          <p>Fixes:</p>\n          <ul>\n            <li>The view no longer jumps or loses your search, selection or wrap setting when the computed diff replaces the instant preview, or on reload.</li>\n            <li>Comparing two empty files no longer shows a spinner forever, and comparison roots that are unreadable, or a file on one side and a directory on the other, now fail with a clear message instead of crashing.</li>\n            <li>The \"moved\" hover pill now also appears on reordered elements whose opening line is unchanged. Previously it was dropped in large, mostly-aligned files, so many moved objects went unmarked.</li>\n          </ul>\n        "},{"timestamp":"1781568000","version":"1.2.4","type":"stable","description":"<p>Inaccessible entries are surfaced</p>\n          <p>Improvements:</p>\n          <ul>\n            <li>Directories and files the running user cannot read, are now shown in the folder comparison tree instead of being silently skipped. Earlier the GUI would freeze in \"Scanning directories...\" when it hit a permission-denied entry</li>\n            <li>Ctrl + Up/Down in the directory view now scrolls the contents</li>\n          </ul>\n        "}],"content_rating_details":{"en_US":{"categories":[{"id":"social","level":"none","description":"No way to chat with other users"},{"id":"drugs","level":"none","description":"No references to alcohol"},{"id":"language","level":"none","description":"No profanity of any kind"},{"id":"money","level":"none","description":"No ability to spend money"},{"id":"sex","level":"none","description":"No nudity of any sort"},{"id":"violence","level":"none","description":"No cartoon violence"}],"minimumAge":3,"minimumAgeText":"Early Childhood","contentRatingSystem":"ESRB"}},"urls":{"bugtracker":"https://gitlab.com/hallyhaa/spekter/-/work_items","homepage":"https://gitlab.com/hallyhaa/spekter","vcs_browser":"https://gitlab.com/hallyhaa/spekter"},"categories":["Development"],"keywords":["diff","compare","directory"],"project_license":"MIT","provides":["inode/directory"],"launchable":{"value":"org.babelserver.spekter.desktop","type":"desktop-id"},"bundle":{"value":"app/org.babelserver.spekter/x86_64/stable","type":"flatpak","runtime":"org.freedesktop.Platform/x86_64/25.08","sdk":"org.freedesktop.Sdk/x86_64/25.08"},"metadata":{"flathub::verification::verified":true,"flathub::verification::method":"website","flathub::verification::website":"babelserver.org","flathub::verification::timestamp":"1779127802","flathub::verification::login_is_organization":false},"is_free_license":true,"isMobileFriendly":false,"branding":[{"value":"#b6bbdb","scheme_preference":"light","type":"primary"},{"value":"#1e2030","scheme_preference":"dark","type":"primary"}],"is_eol":false}