尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A personal dashboard that turns your Spotify listening history into clear visual insights.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A personal dashboard that turns your Spotify listening history into clear visual insights.查看完整 README ↗A personal dashboard that turns your Spotify listening history into clear visual insights.
Live at soleri.fyi
soleri.fyi/u/<id> link with a styled QR code. One link per user; links expire after 90 daysFrontend
Backend
syd1)Database
Third Party APIs
git clone https://github.com/d4n1elliu/Soleri.git
cd Soleri
npm install
Create a .env file in the project root:
# Server-side (used by the api/ serverless functions)
SPOTIFY_CLIENT_ID=your_client_id
SPOTIFY_CLIENT_SECRET=your_client_secret
REDIRECT_URI=http://localhost:5173
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
# Client-side
VITE_SPOTIFY_CLIENT_ID=your_client_id
VITE_REDIRECT_URI=http://localhost:5173
# Canonical site origin used by the SEO prerenderer
VITE_SITE_URL=https://your-domain.com
In production these are set in the Vercel project settings. The Supabase keys are
never exposed to the browser; all database and storage access goes through api/.
Soleri uses two tables and one storage bucket. Row Level Security is enabled with no policies, so only the service role key (used server-side) can read or write.
public.shares — id (text, PK), payload (jsonb), created_at. A daily pg_cron
job deletes rows older than 90 days.public.profiles — spotify_user_id (PK), display_name, bio, pronouns,
location, links (jsonb), pinned_track (jsonb), accent_color, avatar_url,
banner_url, show_genres, show_artists, show_tracks, created_at, updated_at.profile-images — public, 2 MB limit, JPEG/PNG/WebP. Files are stored
at avatars/<id> and banners/<id> and converted to WebP on upload.# Terminal 1: serve the api/ functions on port 3000
vercel dev
# Terminal 2: run the Vite dev server (proxies /api to port 3000)
npm run dev
Then open http://localhost:5173 in your browser.
npm run build
The build type-checks, bundles the app, then prerenders the public routes to static HTML with per-page metadata, structured data, a sitemap and robots.txt.
All endpoints live in api/ and run as Vercel serverless functions. Write endpoints
verify the caller's Spotify token against /v1/me and act as that user only.
| Endpoint | Method | Purpose |
|---|---|---|
/api/share | POST | Create or reuse the caller's share link |
/api/share?id= | GET | Fetch a share snapshot for /u/:id |
/api/profile?spotifyId= | GET | Public profile (Cache-Control: no-store) |
/api/profile | PUT | Save profile fields (rate-limited, ~6/min) |
/api/profile | DELETE | Remove profile row and images |
/api/profile-image?kind=avatar|banner | POST | Upload an image (raw bytes, sniffed, ≤ 2 MB) |
Soleri/
├── api/ # Vercel serverless functions
│ ├── _lib/ # Shared helpers (Spotify fetch, Supabase REST, http utils)
│ ├── auth/ # Spotify OAuth endpoints
│ ├── spotify/ # Top tracks/artists and recently-played endpoints
│ ├── billboard.ts # Billboard Hot 100 data endpoint
│ ├── profile.ts # Profile read/update/delete
│ ├── profile-image.ts # Avatar and banner uploads
│ └── share.ts # Share link creation and lookup
├── public/ # Static assets (logo, OG image, demo video)
├── scripts/ # Build-time SEO prerenderer and route metadata
├── shared/
│ └── types/ # Types shared between api/ and src/
├── src/
│ ├── api/ # API client functions
│ ├── components/
│ │ ├── dashboard/ # Core dashboard widgets, share and scan modals
│ │ ├── insights/ # Listening insight components
│ │ ├── landing/ # Landing page
│ │ ├── legal/ # Terms of Service and Privacy Policy pages
│ │ ├── profile/ # Profile editor (/settings/profile)
│ │ ├── share/ # Public shared profile page (/u/:id)
│ │ └── ui/ # Shared UI primitives (modal, styled QR, avatar)
│ ├── hooks/ # React hooks
│ ├── lib/ # Pure utility and data-processing functions
│ ├── types/ # Frontend TypeScript types
│ └── entry-server.tsx # Build-time SSR entry for the prerenderer
└── vercel.json # Vercel deployment config (region, SPA rewrites)
Spotify tokens are held in memory only and never persisted. Share links contain a stats snapshot you choose to publish; profile data is public on your share link and can be deleted at any time from the editor. See the Privacy Policy.
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Billboard Top 100 chart data is fetched directly from billboard.com. Music data and artist metadata is provided by the Spotify Web API. See NOTICE for full third-party license information.
Licensed under the MIT License.