Skip to content
All work
Case study · 08

Dropwave

Drop a file, get a private link to send anyone. No account, no app to install.

Visit DropwaveLive · no account needed
Status
Live
Context
Personal project
My role
Product, design & engineering
Category
File sharing
Year
2026
dropwave.asrar.software
Dropwave's home page in dark mode: “Drop it here. Share it anywhere.”, a line saying no account or app is needed, and a large drop zone for files up to 10 MB each.

File sharing · Web app · 2026

Upload a file and share it with a private link, or email it straight from the page. Links can expire, images, PDFs and text open in the browser, and every upload is checked before anyone can download it.

The story

How I built it

My role
Product, design & engineering
Context
Personal project

The problem

[01]

Sending someone a file shouldn't need an account, an app or a fight with email attachment limits. But an upload form open to anyone, with no accounts, attracts abuse: oversized files, programs renamed as PDFs, and an email button that spammers would love to use.

What I built

[02]

Dropwave keeps the visitor's side to one gesture: drop a file, get a link. Behind it, the browser uploads straight to a private S3 bucket, the NestJS API checks the real size, and a Lambda reads the first bytes of every file to make sure it is what it claims to be before the link works. Links can expire after an hour, a day, a week, 30 days or at a date you pick, and a scheduled job deletes the expired files.

Key decisions

[03]
  1. Files never pass through the API

    The browser uploads straight to S3 with a presigned URL valid for one minute. A presigned upload can't cap the file size, so when the upload is confirmed the API compares the real size in S3 with the declared one, and deletes the file if they differ.

  2. A file check that can't be faked

    Each new file in S3 triggers a Lambda that reads its first 4 KB, detects the real format and rejects programs and files posing as another type. It reports back with an HMAC-signed request that is refused after five minutes, and applying the same result twice is harmless, because S3 events can arrive more than once.

  3. Email sharing that can't be used for spam

    Five addresses per request and five requests per ten minutes, rate-limited on the real visitor IP that Cloudflare forwards. The link in each email comes from the server's configuration, never from the request, so nobody can slip their own link into an email sent from the domain.

The result

  • 3AWS services: S3, Lambda and SES
  • 10 MBPer file, checked again once it's in storage
  • 30 daysLongest link expiry, if it expires at all
Screens

The real product

Screenshots of the live product, taken with demo data. Open any of them full size.

  • [01]Several uploads at once, each with its own private link.

  • [02]What the recipient sees: the file, its expiry and a download button.

  • [03]Images, PDFs and text open in the browser before downloading.

  • [04]Sharing by email, up to five people at once.

  • [05]Every upload is checked before anyone can download it.

  • [06]Expired links stop working at once.

  • [07]Light and dark themes.

Features

What it does

I can build and run a backend on AWS end to end: a NestJS API with S3, Lambda and SES, deployed to EC2 by CI, and designed for the abuse a public upload form attracts.

[01]

Drop, paste or browse

Drag files in, paste them with ⌘V or pick them from your computer: several at once, up to 10 MB each, with live progress.

[02]

A private link for every file

Each file gets its own link, ready to copy, open or email as soon as its upload ends. Files sit in a private bucket that only the link opens.

[03]

Links that expire

Never by default, or after 1 hour, 1 day, 7 days, 30 days or at a date and time you pick. An expired link stops working at once, and the file is deleted within ten minutes.

[04]

Preview before downloading

Images, PDFs and text files open right in the browser, so the recipient can check a file before saving it.

[05]

Send it by email

Up to five addresses at once. Each person gets their own email with the file's name, size and expiry, without seeing the other recipients.

[06]

Checked before it's shared

Every upload is verified before it can be downloaded: its real size, its real format, and no programs. The share page says so while the check runs.

Built with

The stack

A NestJS API and a Next.js front end in one Turborepo, on AWS: S3 for the files, Lambda for the checks and SES for the emails, on EC2 behind Cloudflare and Traefik, deployed by GitHub Actions.

  • NestJS
  • AWS
  • Next.js
  • TypeScript
  • PostgreSQL
  • Prisma
  • Docker
  • Tailwind CSS

Hiring? Let's talk.

Tell me about the role and the team. I reply within one business day.