The technical details behind privacy, decentralisation, and resilience.
Access is controlled by invite codes, but the system is designed so it cannot link an invite code to the person who used it.
When you redeem an invite code, your device creates a random secret and cryptographically blinds it — a transformation that hides its content. The server signs this blinded secret without ever seeing what it signed. Your device then unblinds the result to get a valid access token.
The server can verify the token is legitimate, but it cannot connect it back to the invite code that produced it. This is called a blind signature (RSA-BSSA, RFC 9474). It's the same principle behind privacy-preserving digital cash.
Almost nothing, by design:
Even if the database were seized, there is no mapping from videos to uploaders.
Videos are stored on IPFS — a decentralised, content-addressed network. Every file gets a unique fingerprint (called a CID) based on its content. The same file always produces the same fingerprint, which makes tampering detectable and content independently verifiable.
Anyone with a CID can fetch the content from the IPFS network. No special permissions, no API keys, no dependence on StreetWitness servers.
Storage is replicated across multiple providers for redundancy — a self-hosted IPFS node plus third-party pinning services.
The archive survives. Every video and its metadata exists on IPFS, independent of this server. Database backups are also pinned to IPFS and published to permanent, public addresses (IPNS names).
If this server disappears, anyone can:
The entire archive is independently verifiable and reconstructable by any third party. No cooperation from the operator is needed.
Everything you need is public. No cooperation from the operator is required.
1. Source code
Clone the repository from codeberg.org/MintyMagpie/streetwitness. Licensed under AGPL-3.0— if you run a modified version as a service, you must publish your changes.
2. Database recovery
Database backups rotate across 7 public IPNS addresses. Resolve any of them to find the latest backup CID, then fetch the PostgreSQL dump from IPFS:
# IPNS recovery addresses
1. k51qzi5uqu5dg948cohftum2b4jterkyxr8dk0ufapzb6c8mcz41revpumat98
2. k51qzi5uqu5dm3rgeaodqsdbfa88c0wa8ryragae5ojk5juko92l14qekm3lu1
3. k51qzi5uqu5dkgbthpcu5223ra7ncbr3tba4msqy8uya8m4sfu0j8h33ni8gxe
4. k51qzi5uqu5djkl70oh9ta7ieo75e9cmz9erydtci9ixn21cgz5eby6j7pa39d
5. k51qzi5uqu5dhngl12hy4h9k03ubtdfjxdta8i1ietc0abaokgxvj3mcl8yth4
6. k51qzi5uqu5dk2zbakpngqzvxyp6pnusgy99u49s82hyriji0mj3wgt1jnugxe
7. k51qzi5uqu5dkhij7vdl5at5prhexowfru3h8gmxf322gka9ettdwchpjfvcaa
3. Resolve and restore
# Install IPFS (Kubo)
ipfs resolve /ipns/k51qzi5uqu5dg948...revpumat98
# Download the backup
ipfs get /ipfs/<resolved-CID> -o backup.sql.gz
# Restore into PostgreSQL
gunzip -c backup.sql.gz | psql streetwitness
# Query for video CIDs
SELECT manifest_cid FROM videos;
# Fetch any video
ipfs get /ipfs/<video-CID> -o video.webm
4. Run your own instance
git clone https://codeberg.org/MintyMagpie/streetwitness.git
cd streetwitness
# Configure env vars (see README)
docker compose up
No proprietary dependencies. The entire stack is Docker Compose + open-source software.
Videos are uploaded as a chain of small chunks. Each chunk contains a pointer to the previous chunk's content fingerprint, forming a self-authenticating chain with no session IDs, no user IDs, and no cookies.
Each chunk proves its position in the sequence by referencing the one before it. The server stores only the chain data — it cannot associate chunks with a particular person.
If a recording is interrupted — phone smashed, connection lost, app crashed — the chunks already uploaded are not lost. An automated recovery process finds orphaned chains and assembles whatever footage exists into a published video.
Evidence is preserved even when the person recording cannot complete the upload.
Right now, all videos are publicly viewable, so access tokens are not required to watch. That means there is no per-user account/session trail for viewing.
When access tokens are used, they rotate per request: the server validates the current token and signs a new blinded one in the same exchange. This is designed to prevent stable session linkage and viewing-history correlation.
Not yet. Current privacy protections focus on unlinking videos from uploaders; the video content itself is stored unencrypted on IPFS.
Planned: every video sealed on upload and automatically released into the public record after 2 weeks. The seal is enforced by threshold encryption on the TaCo network — a cohort of independent nodes where no single party can decrypt alone. Once an upload is scheduled for release, that release cannot be cancelled, delayed, or suppressed. Not by us, not by a court order served on the operator, not by the people in the footage. The decision is fixed the moment the upload lands.
Two weeks is chosen deliberately:
Early access before the 2 weeks expire will be available to press, researchers, and legal teams via paid tokens (BTC, ETH, XMR) or invite codes. This funds the platform without affecting the guaranteed public release.
This is in development, not live. Honest caveat on the planned design: your location is already truncated on your own device before upload, so the server never sees your real GPS. The server will, however, still briefly see video pixels during processing (to compress and re-encode), then encrypt the result and discard the plaintext. This is not end-to-end encryption — it is encrypted-at-rest with a trusted processing window on the server.
Yes. The entire system is open-source with no proprietary dependencies. Anyone can clone the repository, configure a handful of environment variables, and run their own instance.
Because content is stored on IPFS, separate instances can access the same videos by CID. A future goal is federation — multiple instances sharing content automatically.
Sealed release
Every upload sealed for 2 weeks via threshold encryption (TaCo), then released into the public record automatically. Enforced by a decentralised network — once scheduled, nobody can cancel the release, including us. Early access available to press and researchers via paid tokens or invite codes.
Payment integration
Cryptocurrency payments (BTC, ETH, XMR) to sustain the service without identity-based payment processors.
Federation
Multiple StreetWitness instances sharing content via IPFS for increased resilience.
Witness protection
Automatic face and voice blurring of bystanders to protect people who appear in recordings.
Native mobile app
Better recording reliability and background upload than what the browser can offer.