{"id":50933095,"url":"https://github.com/kxxt/ttyrecall","last_synced_at":"2026-06-17T06:04:18.180Z","repository":{"id":362923380,"uuid":"865758871","full_name":"kxxt/ttyrecall","owner":"kxxt","description":"Recall, but for terminal (Work In Progress)","archived":false,"fork":false,"pushed_at":"2026-06-15T13:19:14.000Z","size":883,"stargazers_count":35,"open_issues_count":7,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-15T15:14:57.280Z","etag":null,"topics":["asciinema","ebpf","pty","recall","terminal"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kxxt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-10-01T04:48:19.000Z","updated_at":"2026-06-15T13:19:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kxxt/ttyrecall","commit_stats":null,"previous_names":["kxxt/ttyrecall"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/kxxt/ttyrecall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kxxt%2Fttyrecall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kxxt%2Fttyrecall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kxxt%2Fttyrecall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kxxt%2Fttyrecall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kxxt","download_url":"https://codeload.github.com/kxxt/ttyrecall/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kxxt%2Fttyrecall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34435993,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asciinema","ebpf","pty","recall","terminal"],"created_at":"2026-06-17T06:04:17.525Z","updated_at":"2026-06-17T06:04:18.169Z","avatar_url":"https://github.com/kxxt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"./assets/icon.svg\" alt=\"ttyrecall icon\" width=\"120\" /\u003e\n\n# ttyrecall\n\nRecall, but for terminals.\n\n- [Installation Guide](./INSTALL.md)\n\n# Work In Progress!!!\n\nThis project is still in its infancy. Bugs, non working features, breaking changes are expected.\n\nFor now it can be considered as an asciinema but it is always on, continuously recording your terminals.\n\n# Origin\n\nInspired by [Microsoft's new controversial recall feature for Windows 11](https://support.microsoft.com/en-us/windows/retrace-your-steps-with-recall-aa03f8a0-a78b-4b3e-b0a1-2eb8ac48701c),\nI wonder if I could create something similar for Linux.\nIt is very resource and compute intensive to continuously capture and analyze screenshots in the background so I prefer\nto avoid it. But actually on Linux, we are doing a lot of things in terminals so why not create something similar that\nis based on text instead of screenshots?\n\nBefore adding AI features(if I ever want to do that), `ttyrecall` will focus on collecting and archiving terminal outputs.\nSo it can be considered as [asciinema](https://asciinema.org/), but always on.\n\n# Security Notes\n\n`ttyrecall` records terminal output continuously. Treat recordings as sensitive data: prompts with echo disabled are usually not captured, but any secret printed to a terminal, such as tokens, keys, or command output, can be stored in a recording.\n\nOnly replay recordings from sources you trust. Raw terminal playback through `ttyrecall play` or `asciinema play` writes recorded bytes to your terminal, so a crafted `.cast` file can include hostile terminal escape sequences.\n\n# Current Status\n\n- [x] Record tty in the background to configurable asciicast-v2 or asciicast-v3 format\n- [x] Save the recordings in a directory structure that makes sense\n- [x] DAC so that users by default can only access their own recordings. (recording file is owned by `user:ttyrecall`)\n- [x] Control which users' tty are recorded via a blocklist or allowlist\n- [x] Zstd compression\n- [x] A simple systemd service (See `ttyrecall-git` package).\n- [x] Stop a recording if it overruns a specified soft budget.\n- [x] TUI and web interfaces for browsing and managing recordings.\n\n\nHere is what the collected recordings look like:\n\n```bash\nls -lah /var/lib/ttyrecall/1000/2024/10/04 -lah\ntotal 236K\ndrwxrwx--- 1 kxxt root  774 Oct  4 22:45 .\ndrwxrwx--- 1 kxxt root   12 Oct  4 12:52 ..\n-rw-rw---- 1 kxxt root  23K Oct  4 22:53 codium-pty6-22:37.cast.zst\n-rw-rw---- 1 kxxt root  106 Oct  4 21:57 kded6-pty0-21:53.cast.zst\n-rw-rw---- 1 kxxt root 1021 Oct  4 21:57 konsole-pty1-21:56.cast.zst\n-rw-rw---- 1 kxxt root  663 Oct  4 21:59 konsole-pty2-21:58.cast.zst\n-rw-rw---- 1 kxxt root 8.0K Oct  4 22:01 konsole-pty3-22:00.cast.zst\n-rw-rw---- 1 kxxt root  33K Oct  4 22:24 konsole-pty4-22:08.cast.zst\n-rw-rw---- 1 kxxt root    0 Oct  4 22:12 konsole-pty5-22:12.cast.zst\n-rw-rw---- 1 kxxt root  63K Oct  4 22:50 konsole-pty7-22:42.cast.zst\n-rw-rw---- 1 kxxt root  791 Oct  4 12:53 konsole-pty9-12:52.cast.zst\n-rw-rw---- 1 kxxt root  779 Oct  4 12:52 sudo-pty11-12:52.cast.zst\n-rw-rw---- 1 kxxt root 1.1K Oct  4 22:42 sudo-pty7-22:42.cast.zst\n-rw-rw---- 1 kxxt root  31K Oct  4 22:45 sudo-pty8-22:43.cast.zst\n-rw-rw---- 1 kxxt root  39K Oct  4 22:51 sudo-pty8-22:45.cast.zst\n-rw-rw---- 1 kxxt root  777 Oct  4 12:52 sudo-pty9-12:52-1.cast.zst\n-rw-rw---- 1 kxxt root  221 Oct  4 12:53 sudo-pty9-12:53.cast.zst\n```\n\nThe zstd compressed recordings can be played by the following command:\n\n```bash\nzstd -cd /var/lib/ttyrecall/1000/2024/10/03/konsole-pty8-12:19.cast.zst | asciinema play -\n```\n\n## Asciicast Format\n\nNew recordings default to asciicast v2. You can opt into asciicast v3 with:\n\n```toml\n[daemon]\nasciicast_version = \"v3\"\n```\n\nSearch works with both formats, but v3 has a performance tradeoff: event times are intervals since the previous event, so the search code must scan each matched recording to recover absolute timestamps. `ttyrecall` groups matches by file and scans each matched recording once, but v2 remains the default because its matched event lines contain absolute offsets directly.\n\n# TODO\n\n- [ ] Automatically remove some old recordings in some way.\n- [ ] Allow users to sync the recordings to their server.\n- [ ] Search for something and we can return some sessions that mentioned it and jump to the corresponding timestamp.\n- [ ] Store the recordings in databases or more structured formats to speed up search and indexing.\n- [ ] Add AI to it. (Seriously, should I do this????)\n\n# License\n\nPlease see the license of the individual crates.\n\n- The eBPF module is licensed under `GPL-2.0-or-later`.\n- The xtask crate is also licensed under `GPL-2.0-or-later`.\n- The main binary, `ttyrecall`, is licensed under `AGPL-3.0-or-later`.\n- The common library, `ttyrecall-common`, is licensed under `MIT-0`(MIT No Attribution).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkxxt%2Fttyrecall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkxxt%2Fttyrecall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkxxt%2Fttyrecall/lists"}