尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 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