Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
Live cryptocurrency market data — real-time prices, candlestick charts and market stats.
Translation pending
FinanceTypeScript · JavaScriptGitHub @lodziekOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Suivi de marché crypto : les 250 premières capitalisations, prix en temps réel et graphiques en bougies. Next.js (App Router) déployé sur Vercel. Node >= 20.9 requis (engines dans package.json). Copier .env.example vers .env.local. Aucune n'est obligatoire pour démarrer : sans COINGECKO_API_KEY, l'app bascule sur le quota public partagé par IP, ce qui suffit en local mais provoque des 429 en production. Les valeurs de production vivent déjà dans Vercel. Pour travailler en local, on les rapatrie plutôt que d'en créer de nouvelles :Read the full README ↗
Suivi de marché crypto : les 250 premières capitalisations, prix en temps réel et graphiques en bougies. Next.js (App Router) déployé sur Vercel.
npm run dev # serveur de dev sur http://localhost:3000
npm run build # build de production (à lancer avant tout commit non trivial)
npm run lint # eslint (l'exécutable, pas `next lint` : retiré dans Next 16)
Node >= 20.9 requis (engines dans package.json).
Copier .env.example vers .env.local. Aucune n'est obligatoire pour démarrer :
sans COINGECKO_API_KEY, l'app bascule sur le quota public partagé par IP, ce
qui suffit en local mais provoque des 429 en production.
Les valeurs de production vivent déjà dans Vercel. Pour travailler en local, on les rapatrie plutôt que d'en créer de nouvelles :
npx vercel link && npx vercel env pull .env.local
COINGECKO_API_KEY est un secret : jamais de préfixe NEXT_PUBLIC_, jamais
committée. Elle n'est lue que par app/lib/coingecko.ts, côté serveur.
NEXT_PUBLIC_SITE_URL sert de base aux métadonnées et aux images OG. Un domaine
personnalisé se déclare par cette variable, pas en modifiant app/lib/site.ts.
L'app croise deux sources, et la répartition n'est pas arbitraire.
| Rôle | Source | Clé |
|---|---|---|
| Référentiel : noms, logos, capitalisation, offre, ATH, description, sparkline | CoinGecko | oui, côté serveur |
| Prix en direct | Binance !miniTicker@arr (WebSocket) | non |
| Graphiques en bougies | Binance klines | non |
| Indice Fear & Greed | alternative.me (côté serveur) | non |
Cinq points à connaître avant de toucher à cette répartition.
api.coingecko.com et l'en-tête x-cg-demo-api-key.
pro-api.coingecko.com est réservé aux abonnements payants et répond 401 à
une clé Demo. C'était le bug d'origine : la page détail n'affichait rien.resolvePairs rejette tout écart de
plus de 5 % avec le prix CoinGecko : c'est ce qui évite d'afficher Monero à
118 $ au lieu de 560 $, via un XMRUSDT gelé depuis son délistage.!ticker@arr ne renvoie rien (testé, aucun message en 25 s), alors
qu'il est le flux « complet » annoncé. Utiliser !miniTicker@arr, qui n'envoie
que les symboles ayant bougé. Il ne fournit pas de variation : elle se calcule
(c - o) / o * 100.data-stream.binance.vision, pas stream.binance.com :
dédié aux données de marché, aucun compte requis, et cinq fois plus rapide à
la connexion (1,4 s contre 7,2 s en mesure).app/
├── page.tsx Marché — composant serveur, revalidation 60 s
├── coin/[id]/page.tsx Détail — SSR + generateMetadata (lien partageable)
├── api/chart/[id] Repli graphique, coins sans paire Binance
├── components/ MarketTable (client), CoinRow, PriceChart, Sparkline…
└── lib/
├── coingecko.ts Serveur uniquement : lit la clé API
├── binance.ts REST public : paires, prix, klines
├── symbols.ts Appairage + garde-fou d'écart de prix
├── market.ts Composition des deux sources
├── stream.ts WebSocket partagé, tampon et reconnexion
└── format.ts Intl, notations compactes
Deux règles structurantes :
fetchMarkets renvoie des CoinBase ;
seul resolvePairs produit des Coin. Oublier l'étape est une erreur de
compilation, pas un pair silencieusement absent.Une seule connexion WebSocket dessert toutes les lignes appairées. Le flux
délivre environ 71 tickers par seconde : les ticks sont accumulés dans une Map
et appliqués au plus quatre fois par seconde, alignés sur requestAnimationFrame
— ce qui suspend aussi les mises à jour quand l'onglet passe à l'arrière-plan.
Un setState par message déclencherait une tempête de rendus pour un résultat
que l'œil ne distingue pas.
Le tri du tableau s'appuie sur les valeurs de référence et non sur les prix en direct : trier sur une valeur qui tique replacerait les lignes plusieurs fois par seconde et rendrait impossible de viser une ligne.
next.config.js. Toute nouvelle origine appelée depuis le
navigateur doit être déclarée dans connect-src, sinon elle est bloquée
silencieusement. Les tolérances de développement (unsafe-eval pour React, la
WebSocket HMR) sont accordées par phase et n'existent pas en production.bitcoin et ../../admin passent le même filtre de caractères.dangerouslySetInnerHTML, donc aucun sanitiseur dans le bundle client.next.config.js, 2 espaces dans app/. Pas de
point-virgule en fin de ligne.@layer, base compris. Les
jetons de thème vivent donc en CSS brute dans app/globals.css : placé dans
@layer base, le bloc :root.light était purgé faute de composant écrivant
« light », et le thème clair disparaissait sans erreur ni avertissement.ResizeObserver ne livre rien tant que le navigateur ne peint pas. Le
graphique mesure donc sa largeur à l'attachement du nœud, l'observateur ne
servant qu'au redimensionnement — sinon le tracé peut rester « M0 0 L0 0… »
dans un conteneur pourtant large.prefetch={false}. Sinon chaque ligne visible
déclenche un rendu serveur de la page détail, donc un appel CoinGecko, pour des
pages que personne n'ouvrira.