Template
Votre propre WeTransfer, sur votre propre bucket.
Déposez un fichier, obtenez un code de huit caractères, un lien et un QR code ; tapez le code ou scannez-le sur n’importe quel appareil jusqu’à expiration, puis brûlez-le. Une app Next.js bâtie sur la bibliothèque et les hooks, déployée sur Vercel en un clic avec cinq variables d’environnement.
S3ND_BUCKET=drop
S3ND_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
S3ND_REGION=auto
AWS_ACCESS_KEY_ID=…
AWS_SECRET_ACCESS_KEY=…
# optional
DROP_PASSWORD=… # ask for it before an upload
DROP_EXPIRES_IN=86400 # the default lifetime, in seconds
DROP_MAX_EXPIRES_IN=604800 # the longest a sender may choose
DROP_MAX_SIZE_MB=4 # under Vercel's 4.5 MB request limit
DROP_PREVIEW=true # show what is behind a code before downloading01Ce que vous obtenez
Deux pages et une route.
La page d’accueil pour déposer un fichier ou taper un code, la page de récupération, et le handler de transfert entre les deux. Tout le reste est à vous pour le restyler.
Une zone de dépôt
Glissez un fichier ou choisissez-en un. Il atterrit dans votre bucket sous un code neuf avec une expiration inscrite sur l’objet, et la page affiche le code sur un panneau à volets, le lien à partager, et un QR code de ce lien.
Vous avez déjà un code ?
L’autre moitié de la page d’accueil : tapez les huit caractères lus sur l’autre écran, les fautes de frappe réparées au fil de la saisie (k7qp-2m4x se lit K7QP2M4X), et arrivez sur la page de récupération.
De l’ordinateur au téléphone
Pointez l’appareil photo du téléphone sur le QR code à côté du panneau : la page de récupération s’ouvre sur le téléphone. Téléchargez là, et la page propose de brûler le code juste après, pour que rien ne reste dans le bucket.
Une page de récupération
/K7QP2M4X montre le nom du fichier, la taille et le temps restant, puis remet les octets. Un code inconnu ou expiré obtient le même 404, donc personne ne peut sonder quels codes ont servi.
Un seul fichier de route
createTransferHandler() sert le protocole à quatre routes, donc la CLI fonctionne aussi contre votre déploiement : s3nd put --remote https://drop.s3nd.sh/api/transfers.
Un mot de passe optionnel
Définissez DROP_PASSWORD et le dépôt le demande ; la récupération, jamais. Sans lui, quiconque trouve la page peut déposer un fichier dans votre bucket, ce qui va très bien derrière un proxy et pas du tout sur l’internet ouvert.
02Mise en place
Cinq variables, une règle de cycle de vie.
Le bucket et une paire de clés limitée à celui-ci. Vercel les demande au déploiement ; en local, elles vont dans .env.local.
- 01Créez un bucket sur R2, S3, Scaleway, Wasabi ou un MinIO que vous hébergez, et une paire de clés avec lecture et écriture sur ce bucket et rien d’autre.
- 02Cliquez sur Déployer, collez les cinq valeurs, attendez le build.
- 03Ajoutez une règle de cycle de vie qui supprime les objets sous le préfixe après un jour ou deux : l’expiration empêche un transfert d’être remis, seule la règle supprime l’objet.
- 04Lancez
npx @s3nd/cli doctor --remote https://drop.s3nd.sh/api/transferset regardez-le faire l’aller-retour d’un vrai transfert.
03Bon à savoir
Ce qu’il ne fait pas, pour l’instant.
4,5 Mo sur Vercel
Un fichier passe par la fonction, donc la limite de requête de Vercel s’applique. DROP_MAX_SIZE_MB fixe le plafond en dessous, et un fichier trop gros est refusé avant tout upload. Les uploads présignés depuis le navigateur, qui lèvent la limite, sont sur la feuille de route.
Pas de comptes
Le code est toute la poignée de main, et c’est un jeton au porteur. L’expiration par défaut est d’un jour ; raccourcissez-la avec DROP_EXPIRES_IN pour tout ce qui est sensible, ou chiffrez avant de déposer.
Restylez librement
Tailwind, deux pages, aucun design system à apprendre. Le panneau à volets et l’ambre sont l’identité du site, pas le contrat du template.
Déposez un fichier. Donnez le code.
Pointez-le sur le bucket que vous payez déjà. Rien à déployer, aucune inscription, personne au milieu.