尚未偵測到更新。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.