{"id":49088146,"url":"https://github.com/yoinkify/yoink","last_synced_at":"2026-05-06T23:00:53.472Z","repository":{"id":339667985,"uuid":"1162908734","full_name":"yoinkify/yoink","owner":"yoinkify","description":"paste a spotify or apple music link. get the file.","archived":false,"fork":false,"pushed_at":"2026-04-08T23:16:32.000Z","size":20961,"stargazers_count":116,"open_issues_count":9,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-08T23:32:01.401Z","etag":null,"topics":["apple-music","flac","lossless","media-downloader","music-downloader","nextjs","self-hosted","spotify"],"latest_commit_sha":null,"homepage":"https://yoinkify.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yoinkify.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"chasemarsh"}},"created_at":"2026-02-20T21:04:15.000Z","updated_at":"2026-04-08T23:14:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yoinkify/yoink","commit_stats":null,"previous_names":["chasemarshall/downloader","chasemarshall/yoink","heysonder/yoink","yoinkify/yoink"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/yoinkify/yoink","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoinkify%2Fyoink","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoinkify%2Fyoink/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoinkify%2Fyoink/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoinkify%2Fyoink/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yoinkify","download_url":"https://codeload.github.com/yoinkify/yoink/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoinkify%2Fyoink/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32715436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T19:35:05.142Z","status":"ssl_error","status_checked_at":"2026-05-06T19:35:03.996Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple-music","flac","lossless","media-downloader","music-downloader","nextjs","self-hosted","spotify"],"created_at":"2026-04-20T17:00:36.922Z","updated_at":"2026-05-06T23:00:53.467Z","avatar_url":"https://github.com/yoinkify.png","language":"TypeScript","funding_links":["https://ko-fi.com/chasemarsh","https://ko-fi.com/O5O31P50IY"],"categories":["TypeScript"],"sub_categories":[],"readme":"# yoink\n\npaste a music link. get the file.\n\n**[yoinkify.com](https://yoinkify.com)**\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/O5O31P50IY)\n\nfeedback is greatly appreciated — i thoroughly read every request. **[leave feedback](https://yoinkify.com/r/f)**\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/demo.gif\" alt=\"yoink demo\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n## features\n\n- **tracks, playlists, albums, artists** — paste a link, download everything\n- **lossless** — flac, alac, or 320kbps mp3\n- **full metadata** — id3v2/vorbis tags, album art, synced lyrics, genre, track numbers, explicit flags\n- **apple music catalog matching** — ISRC codes, album artist, and itunes catalog ids embedded into m4a files so apple music recognizes your library\n- **cross-platform links** — apple music and youtube links resolved automatically via song.link\n- **search** — type a song name instead of pasting a link\n- **multi-source audio** — waterfall pipeline across deezer, tidal, and youtube with automatic fallback\n- **metadata fallback chain** — spotify, deezer, and itunes as metadata sources with automatic failover\n- **no accounts** — no sign-up, no cookies, no data stored\n\n## how it works\n\n1. you paste a spotify (or apple music / youtube) link\n2. yoink pulls metadata from spotify, with fallbacks to deezer and itunes\n3. audio is sourced from the best available provider (deezer \u003e tidal \u003e youtube)\n4. the file is tagged with full metadata, album art, and lyrics, then delivered to your browser\n\nnothing is stored on the server after your request completes.\n\n## stack\n\n- [Next.js](https://nextjs.org) 16 (app router, turbopack)\n- [Tailwind CSS](https://tailwindcss.com) 4\n- [ffmpeg](https://ffmpeg.org) for conversion and metadata embedding\n- [Spotify Web API](https://developer.spotify.com/documentation/web-api) for metadata\n- [Deezer](https://developers.deezer.com) for lossless audio and metadata fallback\n- [Tidal](https://developer.tidal.com) for hi-res audio\n- [Piped](https://github.com/TeamPiped/Piped) for youtube audio\n- [lrclib](https://lrclib.net) + [Musixmatch](https://www.musixmatch.com) for lyrics\n- [Song.link](https://song.link) for cross-platform link resolution\n- [iTunes Search API](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI) for genre data and catalog matching\n\n## self-hosting\n\n### docker (recommended)\n\n```bash\ngit clone https://github.com/heysonder/yoink.git\ncd yoink\ndocker compose up -d\n```\n\nthat's it — yoink works out of the box with zero configuration. audio is sourced from youtube via yt-dlp, and metadata comes from public APIs. for lossless audio or better reliability, copy `.env.example` to `.env` and add your credentials (see below).\n\nyoink will be running on `http://localhost:3000`.\n\n### local dev\n\n```bash\ngit clone https://github.com/heysonder/yoink.git\ncd yoink\ncorepack enable\npnpm install\ncp .env.example .env.local\n# fill in your env vars (see below)\npnpm dev\n```\n\nrequires [ffmpeg](https://ffmpeg.org/download.html) installed locally.\n\n### env vars\n\n| variable | required | description |\n|---|---|---|\n| `SPOTIFY_CLIENT_ID` | no | spotify app client id ([create one](https://developer.spotify.com/dashboard)) — falls back to public APIs if not set |\n| `SPOTIFY_CLIENT_SECRET` | no | spotify app client secret |\n| `PIPED_API_URL` | no | piped instance url — we recommend [self-hosting piped](https://docs.piped.video/docs/self-hosting/) as public instances are unreliable |\n| `DEEZER_ARL` | no | deezer session cookie — enables lossless audio from deezer |\n| `TIDAL_CLIENT_ID` | no | tidal app client id |\n| `TIDAL_CLIENT_SECRET` | no | tidal app client secret |\n| `TIDAL_ACCESS_TOKEN` | no | tidal access token — enables hi-res audio from tidal |\n| `TIDAL_REFRESH_TOKEN` | no | tidal refresh token |\n| `SONGLINK_ENABLED` | no | enable cross-platform link resolution (`true`/`false`) |\n| `ACOUSTID_API_KEY` | no | audio fingerprinting for better source matching |\n| `MUSIXMATCH_TOKEN` | no | musixmatch lyrics as fallback when lrclib misses |\n| `LRCLIB_PROXY_URL` | no | cloudflare worker proxy for lrclib if direct access is blocked |\n\nno env vars are required — yoink works out of the box with public APIs for metadata and youtube (via piped) for audio. however, public piped instances are unstable and may cause download failures — for reliable youtube downloads, [self-host piped](https://docs.piped.video/docs/self-hosting/) or provide deezer/tidal credentials. for lossless audio (flac/alac), you'll need a deezer or tidal account to provide the `DEEZER_ARL` or tidal credentials.\n\n### getting lossless audio with deezer (self-hosted only)\n\nif you're self-hosting yoink, you can enable lossless (flac) downloads by providing a deezer ARL token. the web version at [yoinkify.com](https://yoinkify.com) already has this configured — this section is only for self-hosted instances.\n\ndeezer offers a **1 month free trial** of premium, which now includes hifi (lossless) streaming:\n\n1. sign up for a [deezer premium trial](https://www.deezer.com/en/offers) (no charge for the first month)\n2. log in to [deezer.com](https://www.deezer.com) in your browser\n3. open dev tools (F12) → application tab → cookies → `www.deezer.com`\n4. find the cookie named `arl` — copy its value (it's a 192-character string)\n5. set `DEEZER_ARL` in your `.env` to that value\n6. download everything you want in flac\n\nthe ARL token lasts 3-6 months before expiring. you can cancel the trial before it renews if you just need it for a one-time library download.\n\n### youtube audio source\n\nyoink uses youtube as a fallback audio source when deezer and tidal aren't configured. audio is fetched via [piped](https://github.com/TeamPiped/Piped), a youtube proxy. public piped instances can be unreliable — for best results, [self-host your own piped instance](https://docs.piped.video/docs/self-hosting/) and set `PIPED_API_URL` to point to it. note that youtube audio is ~160kbps opus, not lossless.\n\n## rate limits\n\ndefault limits (per IP, in-memory):\n\n- 30 downloads / minute\n- 5 playlist downloads / minute (max 200 tracks per playlist)\n- 15 searches / minute\n- 10 metadata lookups / minute\n\nself-hosted instances have no rate limits by default — adjust in `src/lib/ratelimit.ts`.\n\n## attribution\n\nif you fork or self-host yoink, a \"powered by [yoink](https://yoinkify.com)\" mention is appreciated but not required.\n\n## license\n\nthis project uses [AGPL-3.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoinkify%2Fyoink","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoinkify%2Fyoink","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoinkify%2Fyoink/lists"}