npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@brightkyefoo/codevault

v0.2.1

Published

Exporte le code de tes projets vers https://code-export.brightkyefoo.cm — sauvegarde hors-serveur, consultable en ligne, téléchargeable en zip, visible de toi seul.

Downloads

267

Readme

@brightkyefoo/codevault

→ code-export.brightkyefoo.cm

Exporte le code source de tes projets vers ton espace privé. Chaque envoi crée un snapshot daté, consultable fichier par fichier dans le navigateur et téléchargeable en zip. Si ta machine ou ton serveur tombe, la dernière version est encore là.

Un snapshot n'est visible que par le compte qui l'a envoyé.


En trois minutes

1. Crée ton compte et récupère ton code

Sur code-export.brightkyefoo.cm, section « Agent embarqué » de ton espace, tu génères un code du type A1B2-C3D4-E5F6-G7H8.

Le code généré et les deux lignes à coller dans ton projet

2. Installe et branche

npm install @brightkyefoo/codevault

Puis deux lignes dans le fichier de démarrage de ton projet :

import { register } from '@brightkyefoo/codevault'

register('A1B2-C3D4-E5F6-G7H8')

C'est tout. Au premier lancement le projet part en entier, puis chaque modification déclenche un envoi.

3. Retrouve ton code en ligne

Chaque projet garde son historique. Le bouton Demander un export déclenche un envoi à distance, sans toucher au terminal.

La page d'un projet et son historique de snapshots

Et chaque snapshot s'explore fichier par fichier, ou se télécharge en zip.

L'explorateur de code d'un snapshot


Ou en ligne de commande

Si tu préfères un export ponctuel, sans rien mettre dans ton code :

npm install -g @brightkyefoo/codevault

codevault login          # colle le token affiché sur ton espace
codevault init           # crée codevault.json
codevault push -m "avant refonte"

Agent embarqué

Deux lignes dans le fichier de démarrage de ton projet suffisent :

import { register } from '@brightkyefoo/codevault'

register('A1B2-C3D4-E5F6-G7H8')

Le code se génère sur le dashboard, section Agent embarqué. À partir de là :

  • au premier lancement, le projet part en entier ;
  • ensuite, chaque salve de modifications déclenche un envoi, cinq secondes après le dernier changement ;
  • depuis le dashboard, le bouton Demander un export dépose une demande que l'agent récupère à son prochain sondage.

register() ne lève jamais et ne bloque jamais le démarrage : un code invalide désactive l'agent avec un avertissement, une panne réseau est signalée une fois puis retentée. Une sauvegarde qui empêche un service de démarrer serait pire que pas de sauvegarde.

Ce que le code peut, et ne peut pas

Ce code finit dans ton dépôt Git. Il est donc en écriture seule : il envoie des snapshots, et rien d'autre.

| Action | Code agent | Token API | | --- | --- | --- | | Envoyer un snapshot | oui | oui | | Lister les snapshots | non | oui | | Télécharger une archive | non | oui | | Lire un fichier | non | oui | | Supprimer | non | oui | | Voir l'e-mail du compte | non | oui |

Un code trouvé dans un dépôt public permet au mieux d'ajouter des snapshots inutiles, jamais de lire ton code. Il se révoque en un clic, et les snapshots déjà envoyés restent.

Options

const agent = register('A1B2-C3D4-E5F6-G7H8', {
  url: 'https://code-export.brightkyefoo.cm',
  project: 'mon-api',        // sinon : le nom du dossier ou de codevault.json
  watch: true,               // défaut : actif hors production
  debounceMs: 5000,          // silence avant envoi après une modification
  pollSeconds: 20,           // fréquence de relève des demandes du dashboard
  encrypt: true,             // chiffrement de bout en bout
  passphrase: process.env.CODEVAULT_PASSPHRASE,
  silent: false,
  onEvent: (event) => console.log(event),
})

await agent.exportNow('avant migration')   // export immédiat
agent.stop()                                // arrête surveillance et sondage

Par défaut la surveillance est coupée quand NODE_ENV vaut production : le code n'y bouge plus, seul le sondage des demandes reste actif. Passer watch: true la force.

L'agent écrit son état dans .codevault/agent-state.json, avec un .gitignore à côté. C'est ce fichier qui distingue le premier lancement des suivants, et qui évite de réenvoyer une archive identique.

Où il ne fonctionne pas

register() lit le disque et surveille des fichiers : il lui faut un vrai processus Node avec accès au système de fichiers du projet. Il ne fonctionne donc pas dans un navigateur, ni sur un exécutant de périphérie (Vercel Edge, Cloudflare Workers), ni dans une fonction sans état dont le code est figé dans une archive en lecture seule.

Dans ces cas, l'export se fait au moment de la construction ou du déploiement, avec codevault push dans le job d'intégration continue.

Commandes

| Commande | Rôle | | --- | --- | | codevault login | Enregistre l'URL du serveur et le token. | | codevault logout | Oublie les identifiants (--all pour tous les serveurs). | | codevault whoami | Affiche le compte connecté. | | codevault init | Crée codevault.json dans le dossier courant. | | codevault push | Compresse le projet et l'envoie. | | codevault list | Liste les snapshots (--all pour tous les projets). | | codevault pull [id] | Restaure un snapshot. Sans id, le dernier du projet. | | codevault watch | Envoie un snapshot après chaque salve de modifications. | | codevault rm <id> | Supprime un snapshot du serveur. | | codevault decrypt <fichier> | Déchiffre une archive téléchargée depuis le site. |

Options utiles :

codevault push --dry-run              # liste ce qui partirait, sans rien envoyer
codevault push --encrypt              # chiffre l'archive avant l'envoi
codevault pull <id> --zip             # écrit l'archive au lieu de l'extraire
codevault pull <id> --dir ./restore   # choisit le dossier de destination
codevault watch --debounce 120        # attend 2 min de calme avant d'envoyer

Ce qui part, ce qui ne part pas

Le scan applique dans l'ordre :

  1. une liste d'exclusions permanentes : node_modules, .git, dist, build, .next, coverage, __pycache__, .venv, caches divers ;
  2. les fichiers de secrets : .env, .env.*, *.pem, *.key, id_rsa, .npmrc… Les variantes d'exemple (.env.example) restent incluses ;
  3. les règles de ton .gitignore, y compris ceux des sous-dossiers ;
  4. tes propres motifs exclude et include dans codevault.json.

Les liens symboliques ne sont pas suivis. Les fichiers au-dessus de maxFileSize (2 Mo par défaut) sont écartés, et le total est plafonné à 100 Mo.

Configuration

codevault.json, à la racine du projet :

{
  "project": "mon-projet",
  "useGitignore": true,
  "exclude": ["docs/captures/**", "*.psd"],
  "include": [".env.example"],
  "maxFileSize": 2097152,
  "encrypt": false,
  "url": "https://vault.mondomaine.fr"
}

| Clé | Effet | | --- | --- | | project | Identifiant du projet côté serveur. Minuscules, chiffres, tirets. | | useGitignore | Suivre les .gitignore du projet. | | exclude | Motifs supplémentaires à écarter, syntaxe .gitignore. | | include | Motifs qui réintègrent un fichier écarté par défaut. | | maxFileSize | Taille max d'un fichier embarqué, en octets. | | encrypt | Chiffrer les archives de ce projet. | | url | Serveur visé, si différent de celui enregistré. |

Chiffrement de bout en bout

Avec --encrypt, l'archive est chiffrée sur ta machine avant l'envoi : AES-256-GCM, clé dérivée de ta phrase secrète par PBKDF2-SHA256 (210 000 itérations).

Le serveur reçoit un bloc opaque. Il ne connaît ni le contenu, ni les noms de fichiers, seulement leur nombre. Le manifeste voyage à l'intérieur de l'archive.

Pour relire un snapshot chiffré : saisis ta phrase secrète sur le site, le déchiffrement se fait dans le navigateur, ou passe par codevault pull et codevault decrypt en local.

Une phrase secrète perdue rend le snapshot définitivement illisible. Il n'y a pas de récupération, c'est ce qui fait la garantie.

Variables d'environnement

Pratiques en intégration continue, où rien n'est interactif :

| Variable | Rôle | | --- | --- | | CODEVAULT_TOKEN | Token API, remplace codevault login. | | CODEVAULT_URL | URL du serveur. | | CODEVAULT_PASSPHRASE | Phrase secrète de chiffrement. | | CODEVAULT_HOME | Dossier des identifiants (défaut : ~/.config/codevault). |

Exemple de sauvegarde après un déploiement réussi :

- name: Sauvegarde du code
  env:
    CODEVAULT_TOKEN: ${{ secrets.CODEVAULT_TOKEN }}
    CODEVAULT_URL: https://vault.mondomaine.fr
  run: npx @brightkyefoo/codevault push -m "deploy ${{ github.sha }}"

API programmatique

import { pushProject, scanProject, loadConfig } from '@brightkyefoo/codevault'

// Vérifier ce qui partirait
const { config, root } = loadConfig(process.cwd())
const scan = scanProject({ root, ...config })
console.log(`${scan.files.length} fichiers, ${scan.totalBytes} octets`)

// Envoyer
const snapshot = await pushProject({ message: 'build de prod' })
console.log(snapshot?.webUrl)

Sont aussi exportés ApiClient, buildArchive, extractArchive, encryptBuffer, decryptBuffer, et les types associés.

Où sont stockés les identifiants

Dans ~/.config/codevault/credentials.json, en 0600, une entrée par serveur. Le fichier contient le token en clair : c'est un secret de la même nature qu'une clé SSH. codevault logout l'efface.

Licence

MIT