⚛ UPLANET SDK

⚡ Démarrer — Intégrer ATOM4LOVE en 3 étapes
Étape 1 — Inclure les librairies

Deux lignes suffisent pour le bundle minimum. Les fichiers sont disponibles via plusieurs origines :

<!-- Via IPFS gateway (résolution universel) -->
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/nostr.bundle.js"></script>
<link  rel="stylesheet" href="https://ipfs.copylaradio.com/ipns/copylaradio.com/uplanet-atomic.css">
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_0_foundation.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_1_relay.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_2_api_connect.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/uplanet-header.js"></script>
<!-- Alternativement depuis l'API earth/ -->
<!-- <script src="https://u.copylaradio.com/earth/uplanet-header.js"></script> -->
Étape 2 — Connexion NOSTR
2

Attendre la connexion, lire le pubkey

waitForConnection(async () => {
  const pk = window.userPubkey;        // hex pubkey
  const meta = await fetchUserMetadata(pk); // kind 0
  console.log(meta.name, meta.picture);
});
→ window.NostrState.userPubkey disponible après connexion
Étape 3 — Choisir vos fonctions
A

Partager la page courante sur NOSTR

await shareCurrentPage("Je recommande cet article !");
// → publie un kind 1 avec l'URL actuelle + message
B

Paiement ẐEN (nécessite lib_5_payments.js)

const email = await fetchUserEmailWithFallback(window.userPubkey);
const tx    = await sendMultipassPayment(1, destG1pub, null, email);
const ok    = await verifyMultipassPayment(tx.id);
alert(ok ? '✅ 1 ẐEN envoyé' : '⚠ Réessayez');
C

Score de résonance KIN (nécessite phi2x.js)

const phiA = Phi2X.computePhaseFromForm('1988-03-15', '12:00', 2.35);
const phiB = Phi2X.computePhaseFromForm('1992-07-22', '08:30', 2.35);
const k   = Phi2X.computeResonanceK(phiA, phiB); // 0.0–1.0
const H   = Phi2X.groupHarmonyScore([phiA, phiB]); // groupe

⚠ Prérequis utilisateur

  • Extension NOSTR installée : nos2x, Alby ou Flamingo
  • Ou : MULTIPASS créé via atomic.html (vault key en mémoire)
  • Connexion au relay NOSTR de la station (auto-détecté par lib_2)

⚛ UPLANET SDK

📦 Bundles — Quels fichiers inclure
Fichiers disponibles (earth/)
FichierPoidsExposeDéverrouille
nostr.bundle.js196 KBNostrTools.*Signature sans extension, décodage npub/nsec
uplanet-atomic.css11 KBCSS varsThème KIN (rouge/blanc/bleu/jaune/vert)
lib_0_foundation.js36 KBsafeNostrGetPublicKeyWrapper NIP-07 robuste, proxy iframe
lib_1_relay.js15 KBRelayManagerConnexions WebSocket, NIP-42, queue
lib_2_api_connect.js69 KBgetAPIUrl, connectNostr, waitForConnectionAuto-détection station 54321/12345/7777
uplanet-header.js48 KBNostrState, uphRefreshBandeau UPH, login NIP-07, cache pubkey
lib_3_content.js82 KBpublishNote, shareCurrentPage, createBookmark, fetchComments…Social NOSTR complet : publication, commentaires, bookmarks
lib_5_payments.js11 KBsendMultipassPayment, getMultipassBalance…Paiements ẐEN
phi2x.js30 KBPhi2X.*KIN Tzolkin, phase orbitale, résonance groupe
uplanet-atomic.js8 KB_setKinTheme, _showA4lToastThème KIN dynamique, toasts
Bundle A — Identité (login NOSTR)
<link  href="https://ipfs.copylaradio.com/ipns/copylaradio.com/uplanet-atomic.css" rel="stylesheet">
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/nostr.bundle.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_0_foundation.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_1_relay.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_2_api_connect.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/uplanet-header.js"></script>
<!-- Résultat : bandeau UPH · login 1-clic · window.NostrState · window.userPubkey -->
Bundle B — Social décentralisé (+ commentaires)
<!-- = Bundle A + -->
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_3_content.js"></script>
<!-- + shareCurrentPage(), createBookmark(), fetchComments(), createShareButton() -->
Bundle C — Paiement ẐEN
<!-- = Bundle A + -->
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/lib_5_payments.js"></script>
<!-- + sendMultipassPayment(), getMultipassBalance(), verifyMultipassPayment() -->
Bundle D — Résonance / KIN / ATOM4LOVE
<!-- = Bundle A + -->
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/phi2x.js"></script>
<script src="https://ipfs.copylaradio.com/ipns/copylaradio.com/uplanet-atomic.js"></script>
<!-- + Phi2X.calcKinFromDate(), computeResonanceK(), groupHarmonyScore() -->
<!-- + _setKinTheme(), _showA4lToast() -->
Bundle E — ATOM4LOVE complet
<!-- Tous les bundles A+B+C+D. Ou bien : intégrer atomic.html en iframe -->
<iframe src="https://ipfs.copylaradio.com/ipns/copylaradio.com/atomic.html"
        style="width:100%;height:900px;border:none;border-radius:12px"
        allow="camera;microphone"></iframe>
<!-- lib_0 gère le proxy NIP-07 iframe → extension NOSTR fonctionne en cross-origin -->

Chemins selon l'origine

  • IPFS https://ipfs.copylaradio.com/ipns/copylaradio.com/FICHIER.js
  • API https://u.copylaradio.com/earth/FICHIER.js
  • Local http://localhost:54321/earth/FICHIER.js

lib_2_api_connect.js auto-détecte la station locale (54321/12345) quelque soit l'origine de chargement.

⚛ UPLANET SDK

🔌 Console — Relay NOSTR en direct
Non connecté
→ Cliquez sur Connecter pour voir les événements...
Kinds NOSTR — NIP-101 UPlanet

Filtres writePolicy strfry actifs sur ce relay. Niveaux d'accès : uplanet MULTIPASS local · player constellation · amis amisOfAmis · tous public

KindNomRôleAccès
0ProfilMetadata utilisateur (nom, avatar, about) — NIP-01tous
1NoteNote texte. Tags #BRO → queue IA · #rec → mémoire · #secret → chiffré · #plantnet → botaniqueamis
4DMMessages chiffrés NIP-04/NIP-44. Si destinataire = NODE HEX → queue localetous
7Réaction / ẐENcontent: "+N" → paiement N ẐEN automatique via G1. Vote ASSETS possibleplayer
21VidéoVidéo standard (NIP-71). Durées : ≤30s=Short · ≤300s=Medium · >300s=Long. Tags IPFS : imeta, thumbnail_ipfs, gifanim_ipfsamis
22Vidéo longueVidéo longue durée (NIP-71). Durées : ≤600s=Medium · ≤1800s=Long · >1800s=Extended. Types : live_stream, educational, presentationamis
1984Signalementreport-type=friction → queue Kind 30506 via ASTROBOT N1Mediationplayer
9735Zap receiptPreuve de paiement Lightning (NIP-57)tous
22242Auth NIP-42Authentification relay twin-key (NIP-42). Utilisé par UPassport NIP-98tous
30023ArticleArticle long format (NIP-23). Adressable par d-tagamis
30078ATOM4LOVEEmpreinte vibratoire KIN / app-specific data. Contient phase φ, KIN Dreamspellplayer
30303CustomÉvénement paramétré générique UPlanetplayer
30500Oracle/PermitDéfinitions de permis (système Oracle). Publié par G1HEX stationuplanet
30503Credential WoTx²Verifiable Credential W3C auto-signé après validation. Publié par emit_skill.sh. Tags : ["l", "PERMIT_ID", "permit_type"], ["t", "wotx2"]player
30504Formation WoTx²Ressource pédagogique liée à un permis (vidéo/doc/lien). Tag #t=[skill] indexé dans Qdrant "knowledge" via /api/skill/media/{skill}player
30506Médiation WoTx²Dossier de médiation. Seulement t=friction, pubkeys autorisées uniquementuplanet
30508Match vibratoireRésultat match ATOM4LOVE (k ≥ 0.85 entre deux porteurs). Produit par cabine-33player
30800Config/DIDd=cooperative-config (G1HEX exclusif) · d=did document identité MULTIPASSplayer
30904CrowdfundingCampagnes de financement ẐEN. Valide structure, enregistre clés Bienplayer

⚛ UPLANET SDK

📋 Référence — APIs window.*
lib_2 — Connexion & auto-détection
FonctionRetourUsage
connectNostr(force?)Promise<pubkeyHex>Connecte l'extension NIP-07, publie NIP-42 auth
waitForConnection(cb)voidExécute cb dès que pubkey disponible (idempotent)
getAPIUrl()stringURL UPassport (port 54321, auto-détecté)
getStationUrl()stringURL Astroport (port 12345, auto-détecté)
getRelayUrl()stringURL relay NOSTR (wss, auto-détecté)
NostrState.userPubkeyhex stringPubkey courante après connexion
lib_3 — Contenu social
FonctionRetourUsage
publishNote(content, tags?, kind?)Promise<{success, eventId}>Publie kind 1 (ou autre) sur le relay
shareCurrentPage(msg?)PromisePartage l'URL courante comme note kind 1
createBookmark(url, title)PromiseBookmark kind 30001
fetchComments(url)Promise<Event[]>Commentaires kind 1 pour cette URL
postComment(url, text)PromisePublie un commentaire kind 1 taggé avec l'URL
createShareButton(containerId)voidInjecte un bouton Partager NOSTR dans le DOM
createBookmarkButton(containerId)voidInjecte un bouton Bookmark dans le DOM
fetchUserMetadata(pubkey)Promise<{name,picture,about…}>Profil kind 0
fetchUserEmailWithFallback(pubkey)Promise<email|null>Email depuis DID / kind 0 tags / UPassport
fetchUserUDriveInfo(pubkey)Promise<{url,cid}>URL uDRIVE de l'utilisateur
hexToNpub(hex)stringConvertit pubkey hex → npub1…
npubToHex(npub)stringConvertit npub1… → hex
lib_5 — Paiements ẐEN
FonctionRetourUsage
sendMultipassPayment(amount, destG1, srcG1?, email)Promise<{id,tx}>Envoi ẐEN (passe par /zen_send UPassport)
verifyMultipassPayment(txId)Promise<boolean>Vérifie une transaction
getMultipassBalance(g1Addr)Promise<number>Solde ẐEN d'une adresse G1
initMultipassPayment(email, opts?)PromiseInitialise le module paiement pour un utilisateur
Phi2X — Calendrier & résonance
FonctionRetourUsage
Phi2X.calcKinFromDate(dateStr){kin, glyph, tone, color, colorFr…}KIN Dreamspell depuis date (YYYY-MM-DD)
Phi2X.computePhaseFromForm(date, time, lon)float (radians)Phase φ précise avec longitude
Phi2X.computeResonanceK(phiA, phiB)float 0.0–1.0Cohérence entre deux individus
Phi2X.groupHarmonyScore(phases[])float 0.0–1.0Harmonie pour un groupe (vecteur Ψ)
UPassport — Endpoints clés (port 54321)
EndpointMéthodeUsage
/g1nostrPOSTCréer / récupérer MULTIPASS (email + photo)
/check_balanceGETSolde G1 d'une clé publique
/check_oc_memberGETVérifier membership OpenCollective
/constellation_registerPOSTPublier event kind 30078 sur les relays constellation
/api/upload/imagePOSTUpload image → IPFS + publication NOSTR
/mailjetGET/POSTPréférences notifications KIN
Pages earth/ disponibles