# colis · Livrez vos fichiers à vos clients, depuis votre propre stockage.

> colis est un outil de livraison pour freelances : vous déposez un livrable dans votre bucket S3 ou R2 sous un code de huit caractères, votre client l’ouvre, le prévisualise, puis le valide ou demande des corrections. Chaque étape déclenche un webhook signé. Une page de livraison à déployer, une CLI aux commandes en français, un nœud n8n. Open source, MIT.

Canonical: https://colis-site.vercel.app/ · Markdown: https://colis-site.vercel.app/index.md · English: https://colis-site.vercel.app/en

colis dépose votre livrable dans un bucket qui vous appartient, sous un code de huit caractères. Votre client l’ouvre, le prévisualise, puis le valide ou demande des corrections. Vous savez quand il l’a ouvert et ce qu’il a répondu, et chaque étape peut lancer une automatisation.

- Essayer la démo: https://colis-tau.vercel.app
- GitHub: https://github.com/mamadouwhile/colis

## Une livraison en trois temps.
Le fichier va de votre machine à votre bucket, puis de votre bucket à votre client. Personne d’autre ne le stocke, et personne ne crée de compte.

- **envoi** — Vous l’envoyez dans votre bucket. Déposez le fichier sur votre page de livraison, ou envoyez-le d’un terminal avec colis envoyer. Il arrive dans votre bucket sous un code tout neuf, avec une durée de vie et, si vous le voulez, un mot de passe, une note, ou une suppression au premier téléchargement. [La page de livraison](https://colis-site.vercel.app/drop)
- **ouvert** — Votre client l’ouvre. Un lien, un QR code, ou huit caractères tapés sur la page, fautes de frappe réparées. Il voit le fichier avant de télécharger quoi que ce soit : image, PDF, vidéo, audio, texte. [Fonctionnement](https://colis-site.vercel.app/how-it-works)
- **validé** — Il valide, ou demande des corrections. Un clic pour valider, ou un commentaire sur ce qui doit changer. La réponse est définitive et horodatée ; elle s’affiche sur votre page d’envoi, dans colis statut et dans un webhook. [Webhooks et n8n](https://colis-site.vercel.app/webhooks)

## Une page pour votre client, un terminal pour vous, un webhook pour le reste.
Un seul protocole sous les trois. La page de livraison détient les clés de votre bucket ; le terminal et les automatisations lui parlent.

### La page de livraison (templates/drop)
Un template Next.js à déployer sur votre bucket : la page d’envoi, la page de retrait avec son aperçu et ses deux réponses, et votre suivi.

```text
https://drop.example.com/K7QP2M4X

  maquette-v2.pdf · 1.8 MB · PDF
  « La version avec le logo corrigé »
  [ the PDF, previewed in the page ]

  Le fichier correspond à ce qui était attendu ?
  [ Valider la livraison ✓ ]  [ Demander des corrections → ]
```

### Depuis un terminal (@mdemb/colis)
`envoyer`, `recevoir`, `statut`, `annuler`, `verifier` : les commandes sont en français, seul le code sort sur stdout pour s’enchaîner, et `statut` dit où en est une livraison.

```sh
# colis.config.json points at your delivery page (colis init --provider remote)
$ colis envoyer ./maquette-v2.pdf
maquette-v2.pdf · 1.8 MB · expires in 1 day
K7QP2M4X

# later: where does it stand?
$ colis statut K7QP2M4X
validé
envoyé  2026-09-22 10:00
ouvert  2026-09-22 11:00
validé  2026-09-22 12:00
```

### Les automatisations (n8n-nodes-colis, @colis/protocol)
Un webhook signé à chaque étape, de `parcel.sent` à `parcel.approved`, et un nœud n8n qui lance un workflow sur chacun d’eux.

```ts
// app/api/colis/route.ts, on your side
import { verifyWebhook } from '@colis/protocol'

export async function POST(request: Request) {
  const body = await request.text() // the raw body, before any JSON.parse
  const result = await verifyWebhook(process.env.DROP_WEBHOOK_SECRET!, request.headers, body)
  if (!result.valid) return new Response(null, { status: 401 })

  const event = JSON.parse(body)
  if (event.type === 'parcel.approved') await sendInvoice(event.data.code) // your code
  return new Response(null, { status: 204 })
}
```

## Personne au milieu.
colis est une fine couche au-dessus d’un stockage objet que vous payez déjà. Les fichiers restent dans votre bucket, et la page tourne sur votre déploiement.

- **Votre bucket**: S3, R2, MinIO, Scaleway, Wasabi, ou tout stockage compatible S3. Votre fournisseur, votre région, votre facture.
- **Aucun compte client**: Un code ou un lien suffit. Un mot de passe sur le colis quand vous en voulez un.
- **Droit dans le bucket**: Au-delà de quelques mégaoctets, le navigateur envoie le fichier au bucket lui-même, par morceaux, et reprend si la connexion coupe.
- **Expire tout seul**: Chaque colis a une durée de vie, vérifiée à chaque lecture. Une règle de cycle de vie supprime l’objet, et colis verifier contrôle qu’elle existe.

- [Cloudflare R2: Compatible S3, la région est toujours "auto", et le tableau de bord accepte la règle CORS en JSON.](https://colis-site.vercel.app/providers/cloudflare-r2)
- [AWS S3: Les identifiants viennent de la chaîne de fournisseurs : une Lambda ou une tâche ECS n’a besoin d’aucune clé.](https://colis-site.vercel.app/providers/aws-s3)
- [MinIO: Une commande Docker, et tout le parcours de livraison tourne sur votre laptop.](https://colis-site.vercel.app/providers/minio)
- [Scaleway Object Storage: Des régions européennes, compatible S3, et la région veut vraiment dire quelque chose.](https://colis-site.vercel.app/providers/scaleway)
- [Wasabi: Compatible S3, sur un endpoint régional.](https://colis-site.vercel.app/providers/wasabi)

## Un code que votre client peut taper.
Huit caractères imprimés sur une étiquette d’expédition. Dicté au téléphone, tapé sur un mobile, scanné sur un QR code : il retrouve toujours le colis.

Huit caractères en base32 de Crockford : ni `I`, ni `L`, ni `O`, ni `U`, pour qu’un code survive au papier, au clavier d’un téléphone et à un appel. Ce que le client tape reste tel quel ; seule la recherche est corrigée.

Le code est aussi le lien : `/K7QP2M4X` sur votre page de livraison, c’est la page de retrait, et elle en affiche un QR code pour un téléphone.

Un code vaut accès. Quand le fichier est sensible, donnez au colis une courte durée de vie, un mot de passe, ou supprimez-le au premier téléchargement.

- [Les codes](https://colis-docs.vercel.app/docs/protocole#les-codes)
- [Une livraison confidentielle](https://colis-site.vercel.app/use-cases/livraison-confidentielle)

## Chaque étape peut en déclencher une autre.
La page de livraison publie un événement signé quand un colis est envoyé, ouvert, validé, renvoyé pour corrections ou supprimé. n8n, ou n’importe quelle route qui accepte un POST, le reçoit.

- `parcel.sent`: Un colis a été créé, depuis la page ou depuis la CLI.
- `parcel.opened`: Le client l’a ouvert. La première fois seulement.
- `parcel.approved`: Le client l’a validé.
- `parcel.changes_requested`: Le client demande des corrections ; data.comment dit lesquelles.
- `parcel.deleted`: Le code a été supprimé.

- **Signés selon Standard Webhooks** — HMAC-SHA256 sur l’identifiant, l’horodatage et le corps. `verifyWebhook` de `@colis/protocol` le vérifie avec le code même qui signe, et refuse tout ce qui date de plus de cinq minutes.
- **Un nœud n8n** — Colis Trigger lance un workflow sur les événements choisis et vérifie la signature pour vous. Le nœud Colis envoie, lit et supprime des colis.

## Ce que les freelances livrent avec.
### Livrer
- [Faire valider une maquette: Un PDF ou une image envoyé sous un code, prévisualisé par le client dans la page, validé en un clic ou renvoyé avec un commentaire.](https://colis-site.vercel.app/use-cases/valider-une-maquette)
- [Livrer depuis la CI: Chaque build de recette envoyé depuis la CI sous un code, et la réponse du client qui revient en statut : validé ou à corriger.](https://colis-site.vercel.app/use-cases/livrer-depuis-la-ci)
- [Livrer des fichiers lourds: Jusqu’à 2 Go par défaut, envoyés par le navigateur directement dans votre bucket, par morceaux, avec reprise si la connexion coupe.](https://colis-site.vercel.app/use-cases/fichiers-lourds)
- [Un livrable confidentiel: Un mot de passe que le client tape une fois, une durée courte, et un code qui disparaît au premier téléchargement.](https://colis-site.vercel.app/use-cases/livraison-confidentielle)

### Automatiser
- [Facturer dès la validation: Un déclencheur n8n sur parcel.approved : vous êtes prévenu, et la facture part avec le code du colis en référence.](https://colis-site.vercel.app/use-cases/facturer-a-la-validation)
- [Les corrections dans vos outils: Chaque demande de corrections arrive signée sur votre route, avec le commentaire du client, prête à devenir un ticket.](https://colis-site.vercel.app/use-cases/corrections-dans-vos-outils)
- [Un résumé IA de chaque livrable: À l’envoi d’un document, n8n le télécharge, en extrait le texte et écrit un résumé de cinq lignes pour le suivi du projet.](https://colis-site.vercel.app/use-cases/resume-ia-des-livrables)

## Pourquoi pas une pièce jointe, ou un site d’envoi ?
Parfois, ils suffisent. Chaque page dit quand, et ce que colis ajoute.

- [La pièce jointe: Rien à mettre en place, mais ni aperçu, ni accusé, ni réponse structurée.](https://colis-site.vercel.app/alternatives/piece-jointe)
- [Un service d’envoi hébergé: On dépose sur leur site, on obtient un lien. Rapide, mais le fichier dort chez quelqu’un d’autre.](https://colis-site.vercel.app/alternatives/service-d-envoi)
- [Un dossier partagé: Parfait pour travailler ensemble dans la durée ; lourd pour remettre un livrable.](https://colis-site.vercel.app/alternatives/dossier-partage)
- [La validation par e-mail: « Ok pour moi » dans un fil, ou un clic sur la livraison elle-même.](https://colis-site.vercel.app/alternatives/validation-par-e-mail)

## Celles qui reviennent.
### Qu’est-ce que colis ?
Un outil de livraison pour freelances. Vous envoyez un fichier dans un stockage qui vous appartient (S3, R2, MinIO…) sous un code de huit caractères ; votre client ouvre une page de livraison, prévisualise le fichier, puis le valide ou demande des corrections avec un commentaire. Chaque étape peut déclencher un webhook signé. Il y a une page de livraison à déployer, une CLI en français et un nœud n8n. [Comment ça marche](https://colis-site.vercel.app/how-it-works)

### Mon client doit-il créer un compte ?
Non. Il reçoit un lien, ou tape le code sur la page de livraison, fautes de frappe comprises : minuscules, tirets et O à la place de 0 sont corrigés. S’il y a un mot de passe sur le colis, il le tape une fois. C’est tout. Côté expéditeur aussi, le compte est facultatif : il rattache vos envois à votre adresse, connexion par lien e-mail.

### Où sont stockés les fichiers ?
Dans votre bucket, et nulle part ailleurs. La page de livraison tourne sur votre déploiement, avec vos identifiants ; les gros fichiers vont même directement du navigateur au bucket. colis n’a pas de service hébergé au milieu. [Fournisseurs de stockage](https://colis-site.vercel.app/providers)

### Comment savoir si le client a ouvert ou validé ?
La page de livraison tient un accusé pour chaque colis : envoyé, ouvert (la première ouverture par quelqu’un d’autre que vous), puis validé ou à corriger, avec l’heure et le commentaire. Vous le voyez sur votre page d’envoi, avec colis statut dans un terminal, ou dans les webhooks parcel.opened, parcel.approved et parcel.changes_requested. [Webhooks et n8n](https://colis-site.vercel.app/webhooks)

### Le client peut-il changer d’avis ?
Non : un colis reçoit une seule réponse, qui ne s’écrase jamais. Pour une nouvelle version, envoyez un nouveau colis ; il aura son propre code et son propre accusé.

### Quelle taille peut faire un fichier ?
Depuis la page de livraison, jusqu’à DROP_MAX_UPLOAD_MB, 2 Go par défaut : au-delà de DROP_MAX_SIZE_MB (4 Mo par défaut, à cause de la limite de requête de Vercel), le navigateur envoie directement au bucket, par morceaux de 8 Mio, avec reprise. Il faut alors une règle CORS sur le bucket. Depuis la CLI ou le nœud n8n, l’envoi passe en une requête par la fonction et doit tenir sous DROP_MAX_SIZE_MB. [Livrer des fichiers lourds](https://colis-site.vercel.app/use-cases/fichiers-lourds)

### Un code, c’est sûr ?
Un code est un jeton au porteur : quiconque l’a peut ouvrir ce colis tant qu’il vit. Pour un livrable sensible, ajoutez un mot de passe (haché avec scrypt, jamais récupérable), une durée courte, ou la destruction au premier téléchargement. Les mauvais mots de passe sont limités : dix depuis un client, ou cinquante sur un code, le verrouillent quinze minutes. [Un livrable confidentiel](https://colis-site.vercel.app/use-cases/livraison-confidentielle)

### Que se passe-t-il à l’expiration ?
Le colis n’est plus jamais remis : l’expiration est vérifiée à chaque lecture, et un code expiré répond comme un code qui n’a jamais existé. L’objet lui-même est supprimé par une règle de cycle de vie sur votre bucket, dont colis verifier vérifie la présence. L’accusé de réception, lui, survit au fichier.

### Est-ce que je peux l’installer avec npm ?
Oui pour la commande : npm i -g @mdemb/colis, qui fonctionne sans rien configurer grâce au service public de colis. Le nœud n8n-nodes-colis s’installe depuis n8n. Les paquets @colis/* ne sont pas encore publiés : ceux-là se construisent depuis le dépôt (bun install, puis bun run build), et la page de livraison se déploie sur Vercel en important le dépôt entier. [Installer la CLI](https://colis-site.vercel.app/cli)

### Combien ça coûte ?
colis est libre, sous licence MIT : sur votre propre déploiement, la seule facture est celle de votre stockage et de votre hébergement. Le service public, lui, a deux formules. Gratuite : sans compte, des fichiers jusqu’à 100 Mo, des liens de 24 h, 20 envois par heure. Pro, 6 € par mois ou 60 € par an, avec un compte : jusqu’à 2 Go, des liens de 30 jours, 200 envois par heure. Sans période d’essai, résiliable à tout moment. [L’abonnement Pro](https://colis-docs.vercel.app/docs/abonnement)

Fork de [s3nd](https://github.com/AbderrahmaneMouzoune/s3nd) (MIT), par Abderrahmane Mouzoune.
