nao
오픈소스 분석 에이전트 nao, nao‑core CLI로 컨텍스트 생성하고 모든 사용자를 위한 채팅 인터페이스 배포
Soleri는 Spotify 청취 기록을 실시간 인사이트로 전환해 상위 트랙·아티스트·청취 패턴·발견 비율·Billboard 비교를 제공합니다
Soleri turns your Spotify listening history into live insights: top tracks and artists, listening patterns, discovery rate, artist obsessions and Billboard comparisons.
데이터TypeScript · JavaScriptGitHub @d4n1elliu온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.