full-stackIn progressFeatured

SlackVault

com.aoneahsan.slackvault

SlackVault is a zero-cost Slack backup and archive platform โ€” a Capacitor-powered web/mobile archive app, a WXT Manifest V3 browser extension (built, not on a store yet), and a Cloudflare OAuth worker โ€” that lets workspace members preserve messages, threads, files, and history that Slack's free plan would otherwise delete after 90 days, with every byte stored in the user's own Firebase and FilesHub.

2025-01 โ†’ PresentPersonal Project

At a glance

Category
full-stack
Status
In progress
Started
Jan 2025
Last updated
8 days ago

Identifier

com.aoneahsan.slackvault

Preview

Take a look before you go

The still below is painted first, then the running site loads behind it โ€” so the dialog is never an empty rectangle waiting on a network round trip. Where a site allows framing the live app takes over; where it refuses, the still stays and says so. Nothing is requested until you press.

SlackVault, as its brand card renders

About

What this actually is

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. The extension is built and is not on any store yet.

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.

Worth knowing

  • Four-surface separation of concerns is the headline engineering story: secrets (worker), Slack session/API (extension), presentation (web/mobile app), and the permission contract (Slack manifest) are each isolated. Most "Slack backup" tools collapse these into one risky backend.
  • Privacy by architecture, not by promise: SlackVault never receives user messages. Backup flows browser โ†’ user's own Firebase/FilesHub. The "we never see your data" claim is structurally true.
  • Genuinely zero-cost to operate: the only server compute is a free-tier Cloudflare Worker doing OAuth; everything else is Firebase free tier + FilesHub + client-side work.
  • Cloudflare single-account discipline: every worker secret is prefixed `SLACKVAULT_` so it can't collide with other projects sharing one Cloudflare account.
  • MV3 compliance is deliberate: no remote code, no Firebase Auth popup/redirect in the extension, Chrome Identity / WebAuth flows only โ€” built to survive Chrome Web Store review.
  • One codebase, three distribution shapes: the same React app ships as a website and, via Capacitor 8, as Android and iOS apps (Privacy Screen, App Review/Update, edge-to-edge all wired).
  • Radix theme customizer exposed to all users (appearance/accent/radius/scaling), consistent with the portfolio-wide theming standard.
  • Honest limits: archival speed is bounded by Slack's own API rate limits (by design, Slack-side), and OAuth correctness depends on valid Slack app credentials + worker secrets being configured. The browser extension and iOS app are store-ready but not yet listed; there is no root `LICENSE` file yet despite the declared MIT license.

Built with

  • React 19
  • TypeScript
  • Vite 8
  • Radix Themes
  • TanStack Router
  • Firebase
  • CapacitorJS
  • WXT
  • Cloudflare Workers

Key features

What it does, and what that costs to build

Each of these is a capability the stack genuinely provides. None of them is an outcome nobody measured โ€” there is no "cut onboarding by 40%" on this page, because no one measured onboarding.

  • 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

Screenshots

5 slots, 2 of them filled in

These are designed frames, not pictures. Each one records what belongs in the slot and at what width; the capture itself is taken from the running app. Drawing a fake screenshot here would put an image on the site that no build has ever produced.

Timeline

Still being worked on

  1. Jan 2025

    Work started

    The earliest month on record for SlackVault.

  2. Oct 2026

    Last change

    Status is in-progress โ€” 8 days ago. Ongoing, so this row moves whenever something lands.

Questions

Common questions

The questions that actually arrive, answered in the first sentence.

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.

Keep looking

More full-stack products

  • CL

    ClearHire

    com.aoneahsan.clearhire

    A hiring platform built around one idea: employment claims should be checkable. Resume builder, candidate and company workflows, a verified-employment system, and 50+ career tools.

    completedFeatured
  • TR

    Trizlink

    com.trizlink.app

    Branded short links, link-in-bio pages, click analytics and a suite of utilities.

    completedFeatured
  • LA

    LabFlow

    com.aoneahsan.labflow

    Multi-tenant laboratory information system across three production surfaces.

    completedFeatured
All 23 projects