{"id":47516135,"url":"https://github.com/dhth/dfft","last_synced_at":"2026-05-16T11:03:29.400Z","repository":{"id":303139767,"uuid":"1014477860","full_name":"dhth/dfft","owner":"dhth","description":"monitor changes as AI agents modify your codebase","archived":false,"fork":false,"pushed_at":"2026-03-26T16:48:21.000Z","size":601,"stargazers_count":18,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-27T06:53:12.994Z","etag":null,"topics":["diff","tui"],"latest_commit_sha":null,"homepage":"https://tools.dhruvs.space/dfft/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dhth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-05T20:01:18.000Z","updated_at":"2026-03-26T16:48:24.000Z","dependencies_parsed_at":"2025-07-05T23:27:43.172Z","dependency_job_id":"169781a3-43c7-4b50-8048-73244333c3b7","html_url":"https://github.com/dhth/dfft","commit_stats":null,"previous_names":["dhth/dfft"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/dhth/dfft","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fdfft","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fdfft/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fdfft/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fdfft/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhth","download_url":"https://codeload.github.com/dhth/dfft/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fdfft/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31269179,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T06:57:45.811Z","status":"ssl_error","status_checked_at":"2026-04-01T06:57:42.389Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diff","tui"],"created_at":"2026-03-27T13:00:30.249Z","updated_at":"2026-04-01T07:00:45.487Z","avatar_url":"https://github.com/dhth.png","language":"Rust","funding_links":[],"categories":["\u003ca name=\"programming\"\u003e\u003c/a\u003eProgramming"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003edfft\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/dhth/dfft/actions/workflows/main.yml\"\u003e\u003cimg alt=\"Build status\" src=\"https://img.shields.io/github/actions/workflow/status/dhth/dfft/main.yml?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://crates.io/crates/dfft\"\u003e\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/v/dfft?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/dfft/releases/latest\"\u003e\u003cimg alt=\"Latest Release\" src=\"https://img.shields.io/github/release/dhth/dfft.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/dfft/releases\"\u003e\u003cimg alt=\"Commits Since Latest Release\" src=\"https://img.shields.io/github/commits-since/dhth/dfft/latest?style=flat-square\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n`dfft` (short for \"diff-trail\") lets you monitor changes as AI agents modify\nyour codebase.\n\n![usage](https://tools.dhruvs.space/images/dfft/v0-1-0/dfft.gif)\n\n🤔 Motivation\n---\n\nI recently started to make use of agentic AI tools in my day-to-day workflows.\nWhile I like setting them off on their own to solve problems, every now and then\nI find myself needing to keep an eye on the changes introduced by them, either\nto see if they're on the right track, or just because I'm curious about their\napproach. Most agentic tools will print the changes they make as they make them,\nbut more often than not, the output gets scrolled out of view pretty fast. I\nwanted a fast and simple tool that would let me peruse the changes made by these\nagents at my own pace via a keyboard driven TUI.\n\n`dfft` came out of my attempts at finding a good balance between letting AI\nagents operate freely and having control over every little change in my\ncodebases. The hope is that the added transparency `dfft` provides helps me\nunderstand the process AI agents follow when implementing a change, and also\nlets me catch issues early.\n\n💾 Installation\n---\n\n**homebrew**:\n\n```sh\nbrew install dhth/tap/dfft\n```\n\n**cargo**:\n\n```sh\ncargo install dfft\n```\n\nOr get the binaries directly from a Github [release][1]. Read more about\nverifying the authenticity of released artifacts\n[here](#-verifying-release-artifacts).\n\n⚡️ Usage\n---\n\n```bash\ndfft run --help\n```\n\n```text\nUsage: dfft run [OPTIONS]\n\nOptions:\n  -p, --path \u003cPATH\u003e     Path of the directory to watch (defaults to current directory)\n      --debug           Output debug information without doing anything\n  -f, --follow-changes  Start with the setting \"follow changes\" enabled\n      --no-prepop       Skip prepopulating cache with file snapshots\n      --no-watch        Start with file watching disabled\n      --no-sound        Start with sound notifications disabled\n  -h, --help            Print help\n```\n\n🔔 Notifications\n---\n\nBy default `dfft` will play distinct sound notifications for each kind of change\n(`CREATION` / `MODIFICATION` / `REMOVAL`). You can toggle them on/off whenever\nneeded. If you prefer to not use sound notifications at all, you can build a\nversion of `dfft` that has no audio dependencies using the following.\n\n```bash\ncargo install --no-default-features dfft\n```\n\n📟 TUI\n---\n\n`dfft`'s TUI has 2 panes:\n\n- `diff`: shows the diff for a change, or file contents for newly created files.\n  Supports scrolling.\n- `changes`: Holds the list of changes, with a label for each change\n\n![start](https://tools.dhruvs.space/images/dfft/v0-1-0/start.png)\n\n![tui](https://tools.dhruvs.space/images/dfft/v0-1-0/tui.png)\n\n### General\n\n| Key         | Action              |\n|-------------|---------------------|\n| `?`         | show/hide help view |\n| `Esc` / `q` | go back/exit        |\n| `\u003cCtrl+C\u003e`  | exit immediately    |\n\n### Diff Pane\n\n| Key                 | Action                        |\n|---------------------|-------------------------------|\n| `j` / `↓`           | select next change            |\n| `k` / `↑`           | select previous change        |\n| `J`                 | scroll diff down by a line    |\n| `K`                 | scroll diff up by a line      |\n| `\u003cc-d\u003e`             | scroll diff down by half page |\n| `\u003cc-u\u003e`             | scroll diff up by half page   |\n| `g`                 | select first change           |\n| `G`                 | select last change            |\n| `\u003cspace\u003e`           | toggle watching               |\n| `\u003cc-r\u003e`             | reset list                    |\n| `f`                 | toggle following changes      |\n| `s`                 | toggle sound notifications    |\n| `\u003ctab\u003e` / `\u003cs-tab\u003e` | switch to changes pane        |\n\n### Changes Pane\n\n| Key                 | Action                        |\n|---------------------|-------------------------------|\n| `j` / `↓`           | select next change            |\n| `k` / `↑`           | select previous change        |\n| `g`                 | select first change           |\n| `G`                 | select last change            |\n| `J`                 | scroll diff down by a line    |\n| `K`                 | scroll diff up by a line      |\n| `\u003cc-d\u003e`             | scroll diff down by half page |\n| `\u003cc-u\u003e`             | scroll diff up by half page   |\n| `f`                 | toggle following changes      |\n| `s`                 | toggle sound notifications    |\n| `\u003cc-r\u003e`             | reset list                    |\n| `\u003cspace\u003e`           | toggle watching               |\n| `\u003ctab\u003e` / `\u003cs-tab\u003e` | switch to diff pane           |\n\n### Help Pane\n\n| Key       | Action      |\n|-----------|-------------|\n| `j` / `↓` | scroll down |\n| `k` / `↑` | scroll up   |\n\nIgnoring files\n---\n\nBy default, `dfft` will consider `.gitignore` and `.git/info/exclude` files when\ndeciding which files to ignore. Additionally, you can create a `.dfftignore`\nfile to exclude paths that are not covered by the previous two.\n\n🔐 Verifying release artifacts\n---\n\nIn case you get the `dfft` binary directly from a [release][1], you may want to\nverify its authenticity. Checksums are applied to all released artifacts, and\nthe resulting checksum file is attested using [Github Attestations][2].\n\nSteps to verify (replace `A.B.C` in the commands below with the version you\nwant):\n\n1. Download the sha256 checksum file for your platform from the release:\n\n   ```shell\n   curl -sSLO https://github.com/dhth/dfft/releases/download/vA.B.C/dfft-x86_64-unknown-linux-gnu.tar.xz.sha256\n   ```\n\n2. Verify the integrity of the checksum file using [gh][3].\n\n   ```shell\n   gh attestation verify dfft-x86_64-unknown-linux-gnu.tar.xz.sha256 --repo dhth/dfft\n   ```\n\n3. Download the compressed archive you want, and validate its checksum:\n\n   ```shell\n   curl -sSLO https://github.com/dhth/dfft/releases/download/vA.B.C/dfft-x86_64-unknown-linux-gnu.tar.xz\n   sha256sum --ignore-missing -c dfft-x86_64-unknown-linux-gnu.tar.xz.sha256\n   ```\n\n3. If checksum validation goes through, uncompress the archive:\n\n   ```shell\n   tar -xzf dfft-x86_64-unknown-linux-gnu.tar.xz\n   cd dfft-x86_64-unknown-linux-gnu\n   ./dfft\n   # profit!\n   ```\n\n[1]: https://github.com/dhth/dfft/releases\n[2]: https://github.blog/news-insights/product-news/introducing-artifact-attestations-now-in-public-beta/\n[3]: https://github.com/cli/cli\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fdfft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhth%2Fdfft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fdfft/lists"}