No description
Find a file
2026-07-14 23:07:30 +02:00
.codex docs(ui-audit): design automated visual evidence system 2026-07-12 20:39:04 +00:00
.mcp/problems chore: stop tracking local MCP todo state 2026-07-03 23:13:44 +00:00
.serena Finish docs cleanup 2026-07-03 21:38:41 +00:00
ai-validation fix(ai-validation): batch multimodal embedding requests 2026-07-12 20:37:56 +00:00
android feat(library): add non-destructive folder lifecycle preview 2026-07-12 02:32:29 +00:00
config feat(upload): implement resumable transfers 2026-07-08 18:51:07 +00:00
deploy feat(sync): add authoritative source copy recognition 2026-07-11 08:10:00 +00:00
docs docs(ai): record qualified multimodal reranker profile 2026-07-14 23:07:30 +02:00
runtime-validation feat(runtime-validation): add RT-05B server recovery 2026-07-11 23:03:34 +00:00
src feat(library): add non-destructive folder lifecycle preview 2026-07-12 02:32:29 +00:00
test feat(library): add non-destructive folder lifecycle preview 2026-07-12 02:32:29 +00:00
.dockerignore chore: add Docker WAN deployment artifacts 2026-07-04 05:16:19 +00:00
.gitignore feat(ai): add AIP-00 vision benchmark harness 2026-07-12 03:27:30 +00:00
AGENTS.md docs: prepare MP-10 regie navigation for Codex 2026-07-11 17:30:47 +00:00
Dockerfile fix(deploy): build only server in production image 2026-07-12 20:32:01 +02:00
package.json fix(ai): harden sidecar smoke and metadata diagnostics 2026-07-12 09:09:11 +00:00
pnpm-lock.yaml Update lockfile for thumbnails 2026-07-02 22:12:11 +00:00
README.md docs: close library operations follow-up 2026-07-12 02:39:14 +00:00
tsconfig.json feat(ai): add AIP-00 vision benchmark harness 2026-07-12 03:27:30 +00:00

Pix Drop

Pix Drop est un service local minimal pour envoyer des photos, vidéos ou documents depuis un téléphone vers un dossier choisi de linfra maison.

Flux cible :

Galerie Android → Partager → Pix Drop → destination → upload LAN/VPN → /srv/photos-drop/...

État actuel

Ce dépôt contient maintenant :

  • serveur HTTP Node/TypeScript ;
  • authentification par token dappareil ;
  • rôles admin et destinationManager ;
  • destinations configurées côté serveur et modifiables via API admin ;
  • endpoint raw streamable pour uploader un fichier sans charger tout le fichier en mémoire ;
  • staging puis déplacement atomique vers le dossier final ;
  • cleanup staging après succès, doublon ou upload interrompu ;
  • manifest JSON par import ;
  • browse/download HTTP avec ranges ;
  • miniatures serveur via sharp pour images et ffmpeg pour vidéos ;
  • client Android natif partage/upload/galerie ;
  • enregistrement de liens partagés avec retour rapide à lapp source, routage par fournisseur et Direct Share ;
  • projection catalogue SQLite reconstructible avec canonicalisation, déduplication des liens et miniature YouTube ; létat métier durable library_* nest pas reconstructible depuis les seuls fichiers ;
  • métadonnées riches Open Graph/Twitter des liens web génériques, avec fetch borné et protection SSRF ;
  • recherche FTS5 unifiée sur le catalogue historique et les éléments natifs actifs, filtrée par destinations et memberships despace, avec emplacement courant, lifecycle trash/restore, reconstruction idempotente et portée globale ou espace courant dans la Bibliothèque Android ;
  • identité Android observable et persistée comme cache présentatif scoped au serveur, avec rafraîchissement au démarrage/foreground, états hors ligne/refus/incompatibilité, distinction LAN-VPN des routes sensibles et hub Gérer gardé par les capacités confirmées ;
  • shell Android Régie réversible avec Bibliothèque, Recherche et Transferts comme destinations visibles, Compte secondaire, aliases historiques, entrée Bibliothèque revalidée et indicateurs issus de la projection canonique ;
  • domaine durable Profils/Espaces/Memberships avec backup SQLite et rapport de parité ;
  • éléments stables, dossiers hiérarchiques, stockage natif opaque et APIs Espaces/Dossiers/Éléments, avec compatibilité des destinations historiques ;
  • navigation Android Espaces/Dossiers, fil dAriane, cible À classer et upload natif par folderId, avec repli sur les anciennes destinations ;
  • albums natifs comme collections ordonnées au sein dun espace, sans déplacement des éléments, avec consultation et création depuis Android ;
  • déplacements logiques intra-espace des éléments et dossiers, unitaires ou multiples, avec audit, conservation des collections, anti-cycle et sélecteur hiérarchique Android ;
  • déplacements inter-espaces natifs personnel/partagé avec prévisualisation anti-périmée, contrôle des droits source/cible, retrait atomique des collections source, conservation du stockage opaque et confirmation Android ;
  • upload résumable par sessions persistantes et chunks offsetés, avec idempotence, vérification SHA-256, reprise Android des gros fichiers et long-running Worker foreground partageant le même moteur que le service immédiat ;
  • mode voyage Android avec envoi immédiat, attente dun réseau non facturé ou conservation manuelle, plafond mobile configurable et projection canonique queue/WorkManager/service/réseau partagée par Accueil, Transferts, Envoi, Sauvegardes, badge et notifications ;
  • sauvegarde montante Android depuis MediaStore ou un dossier SAF choisi, avec inventaire local durable, backlog auto-alimenté, progression globale indépendante des jobs de 15, lease dexécution avec heartbeat, notification unifiée, pause/reprise de toute la règle, galerie locale compacte centrée sur les médias, miniatures, ouverture, recherche, tris, filtres et badges détat, diagnostic des erreurs et reprise ciblée ou globale, ainsi quun nettoyage sûr des imports de test vers la corbeille ; MP-02 apporte désormais la garantie serveur durable après recréation de règle, réinstallation ou changement dappareil, avec reconnaissance limitée au même profil, au même dossier cible et au même SHA-256, provenances multi-device et imports manuels distincts ;
  • Corbeille Android plein écran, visuelle et paginée, avec ouverture des médias supprimés, multisélection, sélection de tous les éléments, restauration par lot, suppression définitive par lots idempotents et progression déterminée X/N jusquà la fin du vidage dun espace ;
  • titres logiques éditables pour les éléments natifs et historiques, avec titre source conservé, audit, recherche mise à jour et persistance après reconstruction du catalogue, sans renommer les fichiers physiques ;
  • mise à la Corbeille atomique dune sélection explicite importante ou de tous les éléments directs dun dossier, avec exclusions, snapshot anti-périmé, limite de 20 000 éléments et aucune récursion ;
  • preview non destructive du cycle de vie dun dossier, distinguant portée directe et récursive future, volumes, collections, éléments déjà trashés, protection système et sauvegardes Android locales concernées, sans aucune mutation récursive ;
  • tests dintégration HTTP sur auth, admin, upload, reprise après coupure, browse, ranges, thumbnails, liens, recherche et domaine Bibliothèque, plus tests de rollback inter-espace et tests Android des politiques de reprise, voyage et synchronisation.

Installation

pnpm install
pnpm run build

Configuration

Copier lexemple :

cp config/pix-drop.example.json config/pix-drop.local.json

Générer un hash de token :

node -e "const {createHash}=require('node:crypto'); const t=process.argv[1]; console.log('sha256:'+createHash('sha256').update(t).digest('hex'))" 'mon-token-long'

Démarrage

PIX_DROP_CONFIG=config/pix-drop.local.json pnpm start

Par défaut, le serveur écoute sur 0.0.0.0:1338.

API MVP

Santé :

curl http://localhost:1338/api/health

Destinations et identité de l'appareil reconnu :

curl -H "Authorization: Bearer <token>" http://localhost:1338/api/destinations
curl -H "Authorization: Bearer <token>" http://localhost:1338/api/me

Administration : /admin est protegee par authentification HTTP Basic avec le token admin comme mot de passe. L'API /api/admin/destinations permet de creer ou modifier un album avec le token destinationManager ou le token admin complet.

Cycle de vie des appareils :

curl -H "Authorization: Bearer <admin-token>" http://localhost:1338/api/admin/devices
curl -X POST -H "Authorization: Bearer <admin-token>" http://localhost:1338/api/admin/devices/pascal-s10/disable
curl -X POST -H "Authorization: Bearer <admin-token>" http://localhost:1338/api/admin/devices/pascal-s10/enable
curl -X POST -H "Authorization: Bearer <admin-token>" http://localhost:1338/api/admin/devices/pascal-s10/rotate-token

La rotation renvoie un nouveau token clair une seule fois. L'ancien token devient invalide immédiatement. Les appareils désactivés sont refusés à l'authentification.

Limites operationnelles configurables :

  • limits.maxAdminJsonBodyBytes limite les payloads JSON admin ;
  • limits.maxConcurrentUploads limite le nombre d'uploads actifs ;
  • limits.uploadTimeoutMs coupe les uploads trop longs ;
  • rateLimits.auth, rateLimits.admin et rateLimits.upload appliquent des fenetres fixes par IP client.

Upload raw dun fichier :

curl \
  -X POST \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg \
  "http://localhost:1338/api/upload/raw?destinationId=a-trier&filename=photo.jpg"

Le client Android pourra appeler cet endpoint une fois par fichier partagé, ce qui évite de devoir parser du multipart côté serveur au MVP.

Validation

pnpm run typecheck
pnpm run build
pnpm test
pnpm run android:check

pnpm run android:check exécute les tests Android et assembleDebug. Il répare un JAVA_HOME invalide, réutilise un JDK 17+ déjà disponible et, si nécessaire, initialise une seule fois un JDK 21 vérifié dans android/.toolchains/.

Documentation

Index courant : docs/INDEX.md.

Documents principaux : docs/API.md, docs/CONCEPTION.md, docs/RUNBOOK_DEPLOYMENT.md, docs/HARDENING_LOTS.md, docs/LOT8_ADMIN_WEB_ANDROID.md.

Exploitation

Le runbook complet est dans docs/RUNBOOK_DEPLOYMENT.md.

Doctor local/proxy :

node dist/src/deployment-doctor.js config/pix-drop.local.json '<token-device>' --url http://127.0.0.1:1338