Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A personalized crypto dashboard. You sign up, answer three short questions
once, and the app builds a dashboard from your answers: live coin prices,
news ordered around the coins you follow, an AI-written insight of the day,
and a meme. Every item can be voted on, and the votes are stored for future
recommendation work.
Sign up with any email — nothing is verified, and the quiz takes about ten
seconds. The backend is on Render's free tier, so the first request after a
quiet period takes up to a minute while the instance wakes.README 전문 보기 ↗A personalized crypto dashboard. You sign up, answer three short questions once, and the app builds a dashboard from your answers: live coin prices, news ordered around the coins you follow, an AI-written insight of the day, and a meme. Every item can be voted on, and the votes are stored for future recommendation work.
Live app: https://ai-crypto-advisor-oronr.vercel.app
Sign up with any email — nothing is verified, and the quiz takes about ten seconds. The backend is on Render's free tier, so the first request after a quiet period takes up to a minute while the instance wakes.
| The dashboard | The preferences quiz |
|---|---|
| Sections ordered by the user's own answers, every item votable. | The quiz, revisited as an editable preferences page — coins capped at five, content types set the section order. |
| Your answer | What it affects |
|---|---|
| Coins (1-5) | Which coins appear in Prices; which news moves to the top |
| Investor type | The prompt the AI insight is written from |
| Content types | The order the four sections appear in |
A HODLer and a Day Trader who follow the same coins get different insights. Someone who picks "meme" and "prices" sees those two sections first.
Browser
| JWT in localStorage, sent as a Bearer header on every call
v
Vercel ---- React 19, plain JavaScript, Vite, Tailwind, React Router
| vercel.json rewrites every path to index.html, so the
| router resolves /dashboard on a refresh instead of a 404
|
| direct cross-origin calls; the Render domain is allow-listed by CORS
v
Render ---- FastAPI, Uvicorn, SQLAlchemy ------> Render PostgreSQL
| users, votes, insights
|
+--> CoinGecko prices, free Demo key, cached 60s per coin
+--> RSS feeds CoinDesk, Cointelegraph, Decrypt; static fallback
+--> OpenRouter the daily insight, one per user per day, cached in the DB
|
+--- memegen.link the meme URL comes from the backend, but the image
itself is loaded straight by the browser
Each of the four dashboard sections calls its own endpoint, so one slow or failing source degrades a single card instead of the page.
Frontend — React with plain JavaScript, built by Vite, styled with Tailwind, routed by React Router. Hosted on Vercel.
Backend — FastAPI (Python), served by Uvicorn, talking to Postgres through SQLAlchemy. Hosted on Render.
Data — CoinGecko for prices, CoinDesk/Cointelegraph/Decrypt RSS for news, OpenRouter for the AI insight, and a hand-written meme file rendered by memegen.link.
Two terminals. Backend first:
cd backend
python -m venv venv
venv\Scripts\activate # macOS/Linux: source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload # http://127.0.0.1:8000
It needs a backend/.env file, which is not committed:
DATABASE_URL=postgresql://user:password@host/dbname
JWT_SECRET=any long random string
OPENROUTER_KEY=sk-or-v1-...
COINGECKO_KEY=CG-... # optional locally, needed once deployed
COINGECKO_KEY is a free Demo key. CoinGecko rate-limits by IP address, and a
cloud host's address is shared with many other callers — so anonymous requests
that work from a laptop get refused from a server.
Then the frontend:
cd frontend
npm install
npm run dev # http://localhost:5173
http://127.0.0.1:8000/docs gives an interactive page for every endpoint.
backend/
main.py the eleven endpoints
auth.py password hashing and JWT tokens
schemas.py the shape each request body must have
tables.py the three tables, as SQLAlchemy classes
database.py the database connection
services/ one file per outside data source
frontend/
vercel.json serves index.html for every route, so refreshing works
src/
pages/ Login, Signup, Onboarding, Dashboard
sections/ the four dashboard cards
components/ VoteButtons, CoinIcon, ProtectedRoute, SectionError
lib/ the fetch wrapper, and the preference rules
Nothing goes blank. Each section fetches independently, so a slow or broken source affects only its own card. News falls back to a hand-picked list if all three feeds fail; the AI insight falls back to a fixed message if every model is rate-limited.
The AI insight is generated once per user per day and cached in the database, because OpenRouter's free tier allows 50 requests a day.
Votes are per item, not per section. A thumbs-down on a Dogecoin meme
records topic: "DOGE", not "memes" — so the data says what someone is
actually interested in. Re-voting the same item the same day updates that row;
voting on it a different day is a new row, so changes of opinion over time
are preserved.
Passwords are bcrypt-hashed. The database never sees a real one.
Named on purpose, so nothing reads as an oversight:
docs/ARCHITECTURE.md suggests how it could be.docs/ARCHITECTURE.md — how it's built and whydocs/AI_COLLABORATION.md — how AI tools were
used while building itdocs/TRAINING.md — how the stored votes could be used
to improve recommendations