SlackVault โ a project by Ahsan Mahmood
Exports and archives Slack history so a workspace outgrowing its retention limit keeps its own record.
A free workspace forgets things. It does it quietly, which is the part that matters.
Conversations older than the retention window stop being reachable. So do the decisions inside them, and the files somebody shared, and the reasoning behind a choice nobody wrote down anywhere else. Nothing is deleted in a way anyone notices. It simply stops being findable, and the first sign is somebody asking why a thing was done and nobody being able to say.
SlackVault keeps the record without becoming its keeper.
That second half is the whole design. The obvious way to build this is a service that connects to a workspace, reads it, and stores the messages somewhere convenient, which works and makes the operator a custodian of other people's conversations. This does the opposite: the archive is written into the user's own free-tier storage, so there is no vendor server in the path that could hold anything.
Privacy enforced by architecture is a different claim from privacy promised in copy.
One of them is checkable. If there is no place in the design where a third party's server touches the data, the promise does not depend on anybody's good behaviour, including mine.
Getting there took four surfaces, and each holds exactly one thing.
The browser extension owns the workspace session, because that is where the session already lives and giving a server credentials of its own would create the custodian this avoids. A Cloudflare Worker performs the OAuth token exchange, because that requires a secret which must never reach a browser bundle. The web application reads and searches the archive. A manifest declares the scope of the whole arrangement.
Splitting a small product four ways is more work than not doing it.
The payoff is that each piece is easy to reason about and none of them can quietly acquire a responsibility it should not have. The Worker touches credentials and never messages. The extension touches messages and never holds a long-lived secret. The application reads storage that belongs to the person reading it.
Syncing is incremental.
It runs on a fifteen-minute cadence, and a full re-read of a workspace is expensive and mostly redundant, since almost nothing older has changed since the last pass. Fetching what is new keeps the operation inside a free tier, which is the constraint that decides whether a tool like this can run indefinitely or only until somebody notices the bill.
The archive is meant to be used rather than stored.
Threaded browsing and fuzzy search exist because an archive nobody can search is a backup rather than a record. It exports to JSON and imports from a native workspace export as well, so the data can leave the way it came in.
There is a rule this design inherits and it is worth stating, because it constrains the extension half more than anything else.
An extension loads no remote code. Nothing arrives after installation, which means the behaviour in the package is the behaviour for good. On a tool holding a workspace session that is not a limitation to work around. It is the reason the arrangement is trustworthy at all.
What it cost is setup.
The user has to bring their own storage. That is a real step and a genuine barrier, and it is the direct price of the property the whole thing exists for. A version that stored everything centrally would be easier to start using, and it would also be precisely the product this one was written in order to avoid becoming.
What it does, and what that costs to build
- Incremental Slack backup every 15 minutes
- Cloudflare Worker isolates OAuth secret exchange
- Archive experience (threaded browse, fuzzy search)
- JSON export + Slack-export import
- Data stored in user's own Firebase/FilesHub
- MV3 extension + Android/iOS via Capacitor
- Zero-cost operations across all four surfaces
Built with
- React 19
- TypeScript
- Vite 8
- Radix Themes
- TanStack Router
- Firebase
- CapacitorJS
- WXT
- Cloudflare Workers
Worth knowing
- slack
- backup
- archive
- extension
- cloudflare-workers
- privacy
Who built SlackVault?
Ahsan Mahmood built it, and it is at slackvault.aoneahsan.com with documentation on the same host. One person wrote the browser extension that holds the workspace session, the Cloudflare Worker that performs the token exchange, the web application that reads the archive, and the manifest that declares what the whole thing is allowed to touch. Four surfaces is an unusual amount of separation for one developer, and the separation is the design rather than an accident of how it grew.
Where does my Slack data actually go?
Into your own storage, not mine. The archive is written to the user's own free-tier database and file storage, which means SlackVault never holds anybody's messages and never becomes a custodian of them. That is a structural property rather than a policy: there is no vendor server in the path that could hold the data even if somebody wanted it to. A privacy claim backed by architecture is checkable in a way that a privacy claim in a paragraph is not.
Why does the extension exist rather than doing it all server-side?
Because the extension is the only surface that has the user's workspace session. A server would need credentials of its own to read a workspace, which puts a third party between the user and their messages and creates exactly the custodian the design avoids. Keeping the session in the browser where it already exists means nothing new has to be trusted with it. The extension syncs incrementally rather than in one pass, on a fifteen-minute cadence.
What is the Cloudflare Worker for, if the data does not pass through it?
It performs the token exchange, and nothing else. An OAuth exchange requires a secret that must never appear in a browser bundle, because anything shipped to a browser is readable by whoever received it. So the secret lives at the edge, the exchange happens there, and the resulting token goes to the surface that needs it. The Worker touches credentials and never messages, which is a much smaller thing to trust.
Does SlackVault work on iPhone?
The archive application opens in any browser, an iPhone's included, and the codebase is packaged for Android as well. There is no Apple release, because no Apple Developer account sits behind this work and nothing I build has shipped to the App Store. The extension half is a desktop browser surface in any case, since that is where a workspace session lives, so the phone is where you read an archive rather than where it is collected.
https://aoneahsan.com/projects/com.aoneahsan.slackvault