Self-hosted file transfer. No accounts. No ads. Your server, your data.
Send files, text snippets, or links between any two devices over the internet. A Sender creates a Room, shares a 6-character Room Code, and the Receiver joins and downloads — Delivery confirmed in real time.
Every existing tool either requires an account, caps file size behind a paywall, adds ads, or routes your data through a third-party server you don't control. Synxor runs on your own server. The receiver needs only a browser and a Room Code.
- No account required — anonymous Sender and Receiver, authenticated by a signed Room Token
- Chunked streaming — Receiver can start downloading before upload finishes
- Text Snippets and Links — paste clipboard content or a URL directly into the Room
- Real-time Delivery confirmation — Sender sees when the file arrives
- Short Room Codes — 6-character codes for easy voice or keyboard sharing
- Transfer Log — per-session log of everything sent and received
- Room Expiry — 1 hour, 24 hours, or 7 days
- Dark mode — follows system preference, with manual override
- Self-hostable — single
docker compose up, S3-compatible storage swap via env vars
- Docker Engine 24+
- Docker Compose v2
- 1 GB RAM minimum
- Ports 80 and 443 available (or configure
API_PORT)
git clone https://github.com/izolyte/synxor.git
cd synxor
cp .env.example .env
# Edit .env — set POSTGRES_PASSWORD and MINIO_ROOT_PASSWORD at minimum
docker compose up -dVisit http://localhost:3000/health — you should see { "status": "ok" }.
Note: The UI is not yet available. Phase 1 ships the API and infrastructure only. The full transfer UI ships at v0.1.0.
See .env.example for the full list. Key variables:
| Variable | Default | Description |
|---|---|---|
API_PORT |
3000 |
Port the NestJS API listens on |
POSTGRES_PASSWORD |
— | Required. PostgreSQL password |
POSTGRES_USER |
synxor |
PostgreSQL user |
POSTGRES_DB |
synxor |
PostgreSQL database name |
MINIO_ROOT_USER |
minioadmin |
MinIO admin username |
MINIO_ROOT_PASSWORD |
— | Required. MinIO admin password |
MAX_FILE_SIZE_BYTES |
5368709120 |
Max file size (default 5 GB) |
| Layer | Tech |
|---|---|
| Frontend | TanStack Start + Tailwind CSS + shadcn/ui |
| Backend | NestJS 11 + nestjs-trpc + Socket.io |
| Database | PostgreSQL 17 + Prisma |
| Storage | MinIO (S3-compatible — swap to AWS S3 or R2 via env vars) |
| Infra | Docker Compose + Nginx |
# Prerequisites: Node 24+, pnpm 10+
pnpm install # install all workspace dependencies
pnpm typecheck # type-check all packages
pnpm lint # lint all packages
# Run API locally (requires postgres + minio running)
cd apps/api
pnpm start:devSynxor uses MinIO by default. To use AWS S3 or Cloudflare R2, set:
STORAGE_ENDPOINT=https://s3.amazonaws.com # or your R2 endpoint
STORAGE_ACCESS_KEY=...
STORAGE_SECRET_KEY=...
STORAGE_BUCKET=synxorNo code changes needed.
UNLICENSED — self-hosted personal use.