{"id":13585148,"url":"https://github.com/carderne/signal-export","last_synced_at":"2026-05-30T03:03:20.879Z","repository":{"id":39702262,"uuid":"189061308","full_name":"carderne/signal-export","owner":"carderne","description":"Export your Signal chats to markdown files with attachments","archived":false,"fork":true,"pushed_at":"2024-05-01T07:50:25.000Z","size":260,"stargazers_count":416,"open_issues_count":2,"forks_count":43,"subscribers_count":13,"default_branch":"main","last_synced_at":"2024-05-02T03:44:55.261Z","etag":null,"topics":["backup","chat","export","signal","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"mattsta/signal-backup","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carderne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"carderne"}},"created_at":"2019-05-28T16:04:58.000Z","updated_at":"2024-07-30T22:40:33.144Z","dependencies_parsed_at":"2023-02-04T06:00:43.560Z","dependency_job_id":null,"html_url":"https://github.com/carderne/signal-export","commit_stats":null,"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carderne%2Fsignal-export","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carderne%2Fsignal-export/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carderne%2Fsignal-export/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carderne%2Fsignal-export/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carderne","download_url":"https://codeload.github.com/carderne/signal-export/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246819775,"owners_count":20839095,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["backup","chat","export","signal","sqlite"],"created_at":"2024-08-01T15:04:46.002Z","updated_at":"2026-05-30T03:03:20.862Z","avatar_url":"https://github.com/carderne.png","language":"Python","funding_links":["https://github.com/sponsors/carderne"],"categories":["Python","others"],"sub_categories":[],"readme":"# signal-export\n\n[![PyPI version](https://badge.fury.io/py/signal-export.svg)](https://pypi.org/project/signal-export/)\n\n\u003e [!Note]\n\u003e ⚠️Because the latest versions of Signal Desktop protect the database encryption key, so decrypting involves some extra steps.\n\u003e Good luck.\n\nExport chats from the [Signal](https://www.signal.org/) [Desktop app](https://www.signal.org/download/) to Markdown and HTML files with attachments. Each chat is exported as an individual .md/.html file and the attachments for each are stored in a separate folder. Attachments are linked from the Markdown files and displayed in the HTML (pictures, videos, voice notes).\n\nCurrently this seems to be the only way to get chat history out of Signal!\n\nAdapted from [mattsta/signal-backup](https://github.com/mattsta/signal-backup), which I suspect will be hard to get working now.\n\n## Example\n\nAn export for a group conversation looks as follows:\n\n```markdown\n[2019-05-29, 15:04] Me: How is everyone?\n[2019-05-29, 15:10] Aya: We're great!\n[2019-05-29, 15:20] Jim: I'm not.\n```\n\nImages are attached inline with `![name](path)` while other attachments (voice notes, videos, documents) are included as links like `[name](path)` so a click will take you to the file.\n\nThis is converted to HTML at the end so it can be opened with any web browser. The stylesheet `.css` is still very basic but I'll get to it sooner or later.\n\n## 🐧 Installation\n\n1. Make sure you have Python installed.\n\n2. Install this package:\n\n```bash\npip install signal-export\n\n# ...if you have the \"pipx\" command available, you're probably better off installing with \"pipx install signal-export\"\n```\n\n1. Then run the script!\n\n```bash\nsigexport ~/signal-chats\n\n# or for Windows:\npython -m sigexport C:\\Temp\\SignalExport\n```\n\n## 🪟 Installation: Windows\n\nIf you need step-by-step instructions on things like enabling WSL2, please see the dedicated [Windows Installation](./INSTALLATION.md) instructions.\n\n## Installation nix/nixOS\n\n`signal-export` is packaged in nixpkgs, so you can run\n\n```bash\nnix-shell -I nixpkgs=channel:nixpkgs-unstable --packages signal-export --command 'sigexport ~/signal-chats'\n```\n\nIf you get an error message about `secret-tool` not being found, you probably need to install `libsecret-tools` via your Linux package manager. If you get this on NixOS then just add `libsecret` in the previous command\n\n```bash\nnix-shell -I nixpkgs=channel:nixpkgs-unstable --packages signal-export libsecret --command 'sigexport ~/signal-chats'\n```\n\n## 🚀 Usage\n\nPlease fully exit your Signal app before proceeding, otherwise you will likely encounter an `I/O disk` error, due to the message database being made read-only, as it was being accessed by the app.\n\nSee the full help info:\n\n```bash\nsigexport --help\n```\n\nDisable pagination on HTML:\n\n```bash\nsigexport --paginate=0 ~/signal-chats\n```\n\nList available chats and exit:\n\n```bash\nsigexport --list-chats\n```\n\nExport only the selected chats:\n\n```bash\nsigexport --chats=Jim,Aya ~/signal-chats\n```\n\nYou can add `--source /path/to/source/dir/` if the script doesn't manage to find the Signal config location.\nDefault locations per OS are below.\nThe directory should contain a folder called `sql` with `db.sqlite` inside it.\n\n- Linux: `~/.config/Signal/`\n- Linux Flatpak: `~/.var/app/org.signal.Signal/config/Signal`\n- macOS: `~/Library/Application Support/Signal/`\n- Windows: `~/AppData/Roaming/Signal/`\n\nYou can also use `--old /previously/exported/dir/` to merge the new export with a previous one.\n_Nothing will be overwritten!_\nIt will put the combined results in whatever output directory you specified and leave your previos export untouched.\nExercise is left to the reader to verify that all went well before deleting the previous one.\n\n## Development\n\n```bash\ngit clone https://github.com/carderne/signal-export.git\ncd signal-export\nuv sync --all-groups\n```\n\nVarious dev commands:\n\n```bash\nuv run poe fmt        # format code with Ruff\nuv run poe lint       # lint code with Ruff\nuv run poe check      # typecheck with Pyright\nuv run poe test       # run tests with pytest\nuv run sigexport      # run the signal-export CLI\n```\n\n## Similar things\n\n- [signal-backup-decode](https://github.com/pajowu/signal-backup-decode) might be easier if you use Android!\n- [signal2html](https://github.com/GjjvdBurg/signal2html) also Android only\n- [sigtop](https://github.com/tbvdm/sigtop)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarderne%2Fsignal-export","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarderne%2Fsignal-export","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarderne%2Fsignal-export/lists"}