Give us your Suno handle and do nothing else. Your GitHub README stays in sync with your music — new songs, play counts, and likes appear automatically.
Live Demo · Browse Gallery · Build Your Card
|
Classic Layout |
Player Layout |
Table of Contents
flowchart LR
A[Your Suno Handle] --> B[GitHub Action]
B --> C[Suno Public API]
C --> D[Song & Profile Data]
D --> E[SVG Card Renderer]
E --> F[Your README.md]
style A fill:#7c3aed,color:#fff
style F fill:#7c3aed,color:#fff
There are two usage modes:
- Direct Embed (Zero Setup) — Paste a card URL in your README. GitHub renders the SVG live via Vercel Edge.
- GitHub Action (Auto-Sync) — Add a workflow that runs on a schedule. It fetches your songs from Suno and updates your README automatically.
No GitHub Action needed — paste a URL directly into your README:
[](https://suno.com/song/YOUR_SONG_UUID)The id parameter accepts:
- A full UUID:
a885e43c-6918-456f-a5f0-0e8e29e61066 - A Suno URL:
https://suno.com/song/a885e43c-6918-456f-a5f0-0e8e29e61066 - A short code:
https://suno.com/s/YourShortCode
Tip: Use the interactive builder to customize the card visually, then copy the generated embed code.
## My Suno Music
<!-- SUNO-CARDS:START -->
<!-- SUNO-CARDS:END -->name: Update Suno cards
on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours
workflow_dispatch:
permissions:
contents: write
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ChanMeng666/github-readme-suno-cards@v0.1
with:
handle: YOUR_SUNO_HANDLE
sort: play_count
max: 6
- uses: EndBug/add-and-commit@v9
with:
message: 'chore(suno-cards): refresh'
add: './README.md'Every 6 hours (or on manual trigger), the Action fetches your public songs, sorts them, and writes the cards between your markers.
All examples below use a real demo song. Replace a885e43c-6918-456f-a5f0-0e8e29e61066 with your own song UUID and copy the code to your README.
Tip: Use the interactive card builder to customize any style visually, then copy the generated embed code.
There are 2 layouts x 2 color presets = 4 base combinations.
Info-dense layout with purple accent — title, author, tags, stats, model badge, animated equalizer.
Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Info-dense layout with Suno's official navy + gold palette.
Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Suno-style music player with progress bar, play button, and SUNO logo — using the default purple theme.
Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)The full Suno official look — player layout with navy + gold palette.
Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Each card supports three theme modes:
| Theme | Behavior |
|---|---|
auto (default) |
Switches with GitHub's dark/light setting via prefers-color-scheme |
dark |
Always dark background |
light |
Always light background |
Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)Copy embed code
[](https://suno.com/song/YOUR_SONG_UUID)View toggle variations — fine-tune which elements appear on your card
All toggles accept true or false.
[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)View custom accent color examples — override the accent with any hex value using accent_color
Use the accent_color parameter with any hex value (without the #).
[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)[](https://suno.com/song/YOUR_SONG_UUID)Show your Suno profile stats at a glance — avatar, handle, total plays, likes, followers.
Copy embed code
[](https://suno.com/@YOUR_HANDLE)Your top songs, sorted and stacked together. Use the max parameter to control how many.
Copy embed code
[](https://suno.com/@YOUR_HANDLE)flowchart TB
A["1. Pick a layout"] --> B["2. Pick a color preset"]
B --> C["3. Pick a theme"]
C --> D["4. Toggle elements on/off"]
D --> E["5. Override colors (optional)"]
E --> F["6. Copy the URL"]
style A fill:#7c3aed,color:#fff
style F fill:#7c3aed,color:#fff
Or use the interactive builder for a visual drag-and-drop experience.
Layout options
| Layout | Description | Best for |
|---|---|---|
classic |
Info-dense Spotify-style card with tags, stats, badges | Detailed song info |
player |
Suno-style music player with progress bar and play button | Clean, visual look |
Color presets
| Preset | Colors | Vibe |
|---|---|---|
default |
Purple accent on dark/light background | Modern, neutral |
suno |
Navy + gold palette matching Suno's brand | Official look |
Theme modes
| Theme | Behavior |
|---|---|
auto |
Follows GitHub's dark/light toggle via CSS prefers-color-scheme |
dark |
Always dark background |
light |
Always light background |
Element toggles (11 options)
Each element can be shown or hidden independently. Defaults vary by layout.
| Toggle | Classic default | Player default | Controls |
|---|---|---|---|
show_equalizer |
true |
true |
Animated equalizer bars on cover |
show_tags |
true |
false |
Genre/mood tag chips |
show_plays |
true |
false |
Play count |
show_likes |
true |
false |
Like count |
show_author |
true |
false |
Author byline |
show_duration |
true |
false |
Duration pill on cover |
show_model_badge |
true |
false |
Suno model badge (v4.5/v5) |
show_new_badge |
true |
false |
NEW ribbon on recent songs |
show_progress |
false |
true |
Progress bar + play button |
show_logo |
false |
true |
SUNO logo in bottom-right |
show_link_icon |
false |
true |
Link icon in top-right |
Color overrides
Fine-tune any color with hex values (with or without #):
| Parameter | Description |
|---|---|
bg_color |
Card background |
text_color |
Title / primary text |
subtext_color |
Secondary text |
accent_color |
Equalizer bars, chips, progress bar |
border_color |
Card border |
Example — Full custom colors:
[](https://suno.com/song/YOUR_SONG_UUID)API Reference — 3 endpoints, all parameters
| Endpoint | Description |
|---|---|
GET /api/card?id=<uuid|url|short> |
Single song card (SVG) |
GET /api/profile?handle=<handle> |
Profile summary card (SVG) |
GET /api/cards?handle=<handle> |
Stacked multi-card auto-discovery (SVG) |
GET /song/<uuid> |
Pretty URL alias for /api/card?id=<uuid> |
Base URL: https://github-readme-suno-cards.vercel.app
| Parameter | Type | Default | Description |
|---|---|---|---|
id |
string | required | Song UUID, Suno URL, or short code |
layout |
classic | player |
classic |
Card layout |
preset |
default | suno |
default |
Color preset |
theme |
auto | dark | light |
auto |
Theme mode |
lang |
en | zh | ja |
en |
Language |
width |
200–1200 |
auto | Card width in pixels |
show_equalizer |
boolean | layout-dep. | Animated equalizer |
show_tags |
boolean | layout-dep. | Tag chips |
show_plays |
boolean | layout-dep. | Play count |
show_likes |
boolean | layout-dep. | Like count |
show_author |
boolean | layout-dep. | Author byline |
show_duration |
boolean | layout-dep. | Duration pill |
show_model_badge |
boolean | layout-dep. | Model badge |
show_new_badge |
boolean | layout-dep. | NEW ribbon |
show_progress |
boolean | layout-dep. | Progress bar |
show_logo |
boolean | layout-dep. | SUNO logo |
show_link_icon |
boolean | layout-dep. | Link icon |
max_tags |
0–20 |
auto | Max tag chips |
bg_color |
hex | preset | Background color |
text_color |
hex | preset | Primary text color |
subtext_color |
hex | preset | Secondary text color |
accent_color |
hex | preset | Accent color |
border_color |
hex | preset | Border color |
| Parameter | Type | Default | Description |
|---|---|---|---|
handle |
string | required | Suno user handle |
theme |
auto | dark | light |
auto |
Theme mode |
lang |
en | zh | ja |
en |
Language |
width |
200–1200 |
auto | Card width |
bg_color, text_color, subtext_color, accent_color, border_color |
hex | preset | Color overrides |
Includes all /api/card visual parameters, plus:
| Parameter | Type | Default | Description |
|---|---|---|---|
handle |
string | required | Suno handle |
sort |
created_at | play_count | upvote_count | name |
created_at |
Sort order |
max |
1–20 |
6 |
Max cards |
include_tags |
CSV | — | Only songs matching these tags |
exclude_tags |
CSV | — | Exclude songs matching these tags |
min_duration |
seconds | — | Minimum duration |
max_duration |
seconds | — | Maximum duration |
min_plays |
integer | — | Minimum play count |
min_likes |
integer | — | Minimum like count |
pinned_first |
boolean | true |
Prioritize pinned songs |
featured |
CSV of UUIDs | — | Pin specific songs above all |
allow_explicit |
boolean | true |
Include explicit songs |
show_profile_card |
boolean | true |
Show profile card above songs |
- Upstream (Suno API calls): revalidated every 3600s (card) or 600s (profile/cards)
- Downstream (HTTP response):
Cache-Control: s-maxage=3600, stale-while-revalidate=86400 - GitHub's Camo proxy caches SVGs — changes may take up to an hour to appear
GitHub Action Reference — all inputs & outputs
| Input | Default | Description |
|---|---|---|
handle |
— | Your Suno handle (auto-discovery mode) |
manifest_path |
./suno-songs.yml |
Path to YAML manifest of song IDs |
song_ids |
— | Comma-separated UUIDs inline |
| Input | Default | Description |
|---|---|---|
sort |
created_at |
created_at | play_count | upvote_count | name |
max |
6 |
Max song cards (1–20) |
include_tags |
— | CSV substring filter (case-insensitive) |
exclude_tags |
— | CSV substring filter |
min_duration / max_duration |
— | Seconds |
min_plays / min_likes |
— | Integer floors |
pinned_first |
true |
Respect is_pinned above sort order |
featured |
— | CSV of UUIDs pinned above everything |
allow_explicit |
true |
Include explicit-tagged songs |
show_profile_card |
true |
Emit profile card above song cards |
| Input | Default | Description |
|---|---|---|
layout |
classic |
classic or player |
preset |
default |
default (purple) or suno (navy + gold) |
theme |
auto |
auto / dark / light |
lang |
en |
en / zh / ja |
width |
— | Card width in px (200–1200) |
bg_color |
— | Background hex (with or without #) |
text_color |
— | Primary text color |
accent_color |
— | Accent color |
show_progress |
layout-dep. | Progress bar + play button |
show_logo |
layout-dep. | SUNO logo in bottom-right |
show_link_icon |
layout-dep. | Link icon in top-right |
| Input | Default | Description |
|---|---|---|
render_mode |
service |
service (live) or local (pre-render SVGs) |
local_cards_dir |
.suno-cards |
Output dir in local mode |
readme_path |
./README.md |
Path to README |
comment_tag_name |
SUNO-CARDS |
Marker name (allows multiple instances) |
output_type |
markdown |
markdown or html (with <picture> theme switching) |
output_only |
false |
Skip README write, emit via outputs only |
base_url |
https://github-readme-suno-cards.vercel.app |
Self-hosted service override |
| Output | Description |
|---|---|
profile |
JSON-encoded SunoProfile |
clips |
JSON-encoded array of SunoSong |
cards_block |
The markdown/HTML block written to README |
rendered_files |
JSON array of SVG paths (local mode only) |
Render Modes — Service vs Local
flowchart LR
subgraph service["Service Mode (default)"]
S1["README links to<br/>github-readme-suno-cards.vercel.app"] --> S2["SVG rendered on-the-fly"]
S2 --> S3["Always up-to-date<br/>play counts, badges"]
end
subgraph local["Local Mode"]
L1["Action pre-renders SVGs"] --> L2["Committed to .suno-cards/"]
L2 --> L3["Zero external dependency<br/>works offline, in mirrors"]
end
The Action writes markdown pointing at the hosted Vercel service. Cards auto-update whenever anyone views your README — play counts, NEW badges, and any data change reflects live.
# No extra config needed — service mode is the default
- uses: ChanMeng666/github-readme-suno-cards@v0.1
with:
handle: YOUR_HANDLEThe Action pre-renders SVGs with embedded base64 cover images into .suno-cards/ in your repo. Zero dependency on any hosted service.
- uses: ChanMeng666/github-readme-suno-cards@v0.1
with:
handle: YOUR_HANDLE
render_mode: local
local_cards_dir: '.suno-cards'Example Workflows — ready-to-copy workflow files
See examples/ for ready-to-copy workflow files:
| File | Mode | Description |
|---|---|---|
auto-discovery.yml |
Service | Zero-config auto-discovery — just your handle |
manifest-mode.yml |
Service | Explicit song list via YAML manifest |
local-mode.yml |
Local | Pre-render SVGs to your repo |
suno-songs.yml |
— | Sample manifest file |
Roadmap
- Waveform card variant (Action local mode only) — download MP3, compute amplitude samples, render SVG
<path> - Lyrics excerpt card — parse
[Chorus]from structured prompt, render as card subtitle - Playlist card — render Suno playlists
- JSON API —
/api/song.jsonand/api/profile.jsonfor third-party tools - PNG export —
/api/card.pngvia@resvg/resvg
- Vercel KV play-count history — trending arrows (
+15 this week), weekly summaries - RSS/Atom feed per handle —
/api/feed/{handle}.xml
- Cover-art color extraction for per-song gradient backgrounds
- Song-DNA radar chart card
- Year-in-review card
Architecture & Internals — monorepo structure, rendering technique, web app
graph TB
subgraph Monorepo["pnpm Monorepo"]
subgraph packages["packages/"]
Parser["@suno-cards/parser<br/>Suno API client<br/>+ Valibot schemas"]
Render["@suno-cards/render<br/>SVG card primitives<br/>(pure, no network I/O)"]
end
subgraph apps["apps/"]
Web["@suno-cards/web<br/>Next.js 15 on<br/>Vercel Edge Runtime"]
end
subgraph action["action/"]
Action["GitHub Action<br/>Node 20<br/>esbuild-bundled"]
end
end
Parser --> Web
Parser --> Action
Render --> Web
Render --> Action
SunoAPI["Suno Public API<br/>studio-api-prod.suno.com"] --> Parser
Web --> Vercel["Vercel Edge<br/>~20ms warm"]
Action --> GH["GitHub Actions<br/>Scheduled / Manual"]
| Package | Role |
|---|---|
packages/parser |
Suno API client + Valibot schemas. Zero HTML scraping — uses only public studio-api-prod.suno.com endpoints. |
packages/render |
SVG card primitives. Pure functions, no network I/O. Template-literal SVG with <foreignObject> for CJK-friendly rich text. |
apps/web |
Next.js 15 on Vercel Edge Runtime. 3 API routes + 3-page React frontend with Tailwind CSS. |
action |
Node 20 GitHub Action. Bundled with esbuild, committed dist/index.js. |
- SVG with
<foreignObject>for CJK-friendly rich text layout - CSS
@media (prefers-color-scheme)for auto dark/light theming - CSS
@keyframeson HTML<span>s inside foreignObject for the animated equalizer bars - Dual-layer caching: Vercel Data Cache for upstream Suno calls + HTTP
Cache-Controlfor downstream GitHub Camo proxy
The project includes a full 3-page React frontend at github-readme-suno-cards.vercel.app:
| Page | URL | Description |
|---|---|---|
| Home | github-readme-suno-cards.vercel.app | Hero showcase, feature highlights, featured card styles |
| Gallery | github-readme-suno-cards.vercel.app/gallery | Browse 20+ curated presets with layout/preset/theme filters |
| Builder | github-readme-suno-cards.vercel.app/builder | Interactive card builder with live preview, toggles, color pickers, and embed code generator |
Uses only the public https://studio-api-prod.suno.com endpoints that Suno publishes as their oEmbed provider. No cookies, no session tokens, no reverse-engineered auth.
The card primitives borrow ideas from several excellent projects:
github-readme-medium-recent-article— Next.js + Vercel architecturegithub-readme-youtube-cards— dual-mode Action + service, theme switchingblog-post-workflow— esbuild bundling, marker-replace regex, CI dist-diff verificationspotify-github-profile— CSS-animated equalizer overlay technique
Chan Meng