Open-source project
better-lyrics/better-lyrics avatar
better-lyrics/better-lyrics

Better Lyrics rebuilds the YouTube Music lyrics tab around synced lines

Better Lyrics for YouTube Music - Enhance YouTube Music with beautiful time-synced lyrics, multilingual support, real-time translations and more ✨

954 stars91 forksTypeScriptGPL-3.0

At a glance

What is it?
Better Lyrics is a browser extension for Chrome, Firefox and Edge that replaces the YouTube Music lyrics tab with time-synced lines you can click to seek, plus translations, romanization and pluggable lyrics providers. It is GPL-3.0 licensed, it needs no external configuration, and its v3 line is a recent rewrite with releases every few days.
Who is it for?
Adopt Better Lyrics if you listen on YouTube Music and want lyrics you can seek by line, in a language the native tab does not offer, and if you are the kind of user who will point the extension at the lyrics providers that work for your region. Do not adopt it if you only need the lyrics YouTube already supplies, since the extension adds a dependency on external providers and a browser extension to your listening session.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A lyrics tab that is an extension, not a YouTube feature

Better Lyrics exists because the lyrics experience in YouTube Music is thin. The extension's own summary is that it upgrades the YouTube Music experience by providing time-synced lyrics for songs, and the repository topics list chrome-extension, firefox-addon, lyrics, youtube and youtube-music.

The audience is listeners, not developers, and the deployment is deliberately frictionless. The README states that the extension requires no external dependencies or configurations, which is the claim that matters most for a consumer tool: there is no account, no server to run and no file to edit before the thing works. The features list adds a full screen mode, a UI available in multiple languages, translations and romanization for foreign language tracks, and customizable lyrics providers from multiple sources.

The Theme Marketplace is the part with a community dimension. The README lists community themes as a feature, and the repository carries both STYLING.md and STYLING-SKILL.md, which suggests the styling side of the extension is documented for both people and for coding agents.

What this is not is a downloader, a scraper you run yourself, or a desktop application. It is an extension that loads into a browser you already use, which is why the permission question and the provider question matter more here than they would for a command line tool.

Clicking a line is what makes the synced lyrics useful

The usage section is three steps and the third one is the point. Open YouTube Music and start playing a song, click on the lyrics tab to view the time-synced lyrics, which the README notes might take a few seconds to load, and then click on a specific line to seek to that part of the song.

That third step is the mechanism that separates this from a wall of text. The extension renders each line as an interactive element, and the interaction is a seek, so the bar and the lyrics stay in step with each other as you navigate. The features list puts it plainly: it lets you seek by clicking on any line.

The loading delay is worth planning around, because it is a consequence of how the lyrics are obtained. The lyrics are not part of the YouTube Music page, they are fetched by the extension from the providers you have configured, and the search for a match, the request and the parsing all happen after you open the tab. For a listener this reads as a brief wait, and for someone evaluating the extension it tells you that network round trips are on the critical path of every track.

Full screen mode is also a first class feature, with blurred album art background listed under the Display options alongside full screen mode itself. The extension is therefore designed to be looked at while a track plays, not merely glanced at.

Providers are configurable, and that is the fragile part

The features list includes customizable lyrics providers from multiple sources, and the general options table in the README includes a Cache Details entry, which is the visible hint that the extension keeps cached data about what it has fetched.

This design is the interesting engineering decision in the project. Rather than shipping one source of lyrics, the extension lets you choose where the text comes from, and the practical consequence is that the quality of the result depends on configuration rather than on the extension alone. A provider that has the track gives you synced lines; a provider that does not gives you nothing useful, or something unsynced.

It also means the extension is dependent on third party endpoints that the project does not control, and on the lyrics being correctly matched to the track you are playing. A mismatch between the track and the lyrics is the failure mode you should expect to encounter, and it is not something the extension can detect on its own.

The same logic explains the multi-language support. Translations and romanization for foreign language tracks, plus a UI available in multiple languages, are separate concerns that the feature list keeps distinct, and the repository backs the interface side with a Crowdin project, a crowdin.yml file, an _locales/ directory and a script that generates the locale files before every build.

One codebase, three browsers, and a manifest that decides the target

The extension ships for Chrome, Firefox and Edge from the same repository, and the build tooling reflects that. The npm scripts use a shared extension command with the browser passed as an argument:

json
        "build": "npm run generate:locales && extension build --browser all",

The development scripts show the same pattern, with a separate Chrome profile directory and a Firefox variant:

json
        "dev": "npm run generate:locales && extension dev --browser chrome --profile dist/extension-js/profiles/chrome-profile/dev",
        "dev:firefox": "npm run generate:locales && extension dev --browser firefox",

Brave is handled by pointing the chromium binary at the installed application, which tells you the Edge and Brave builds reuse the Chromium target rather than needing a separate implementation.

Quality tooling around that build is worth a mention for contributors. Linting and formatting run through biome, with a single command that does both:

json
        "lint": "biome lint --write . && biome format --write .",

There is also a typecheck script that regenerates locales before running tsc, a selfcheck script, a check for branding in the localisation files, and a knip configuration for unused code. The repository root adds a trusted-types.d.ts file, an extension-env.d.ts file, an env.example file, an extension.config.js file, a manifest.json, tooling/ and pages/ directories, and an AGENTS.md file. That is a fairly complete setup for a project that expects both human and agent contributions.

The options in the README are only part of the picture

The Options section of the README is thin, and that is worth flagging because it is where a reader usually looks for the controls that define behaviour. What is documented is organised into tabs in the extension popup, and the excerpt shows two of them.

The General tab lists Show logs, which is Enabled by default, Auto switch to Lyrics tab, which is Disabled by default, and a Cache Details entry with no default. The Display tab lists Blurred album art background, Enabled, and Full screen mode, also Enabled.

Two things can be inferred from that table. The defaults are conservative, since the extension does not take over the tab unless you ask it to, and the presence of Show logs enabled by default says the project expects troubleshooting to be a normal part of using it. The Cache Details row suggests there is a view over what the extension has cached, which matters if you are managing a large library of tracks and want to know what is stored.

What the README does not do is list every option, and the table of contents in the README points to sections that were not included in what is available here, including the extension permissions section, the styling section, the Theme Marketplace section, the FAQ and the privacy section. The repository holds PRIVACY.md and a separate STYLING.md, so the detail exists, but it is not in the README itself. Settings that are not documented in the README are exactly the ones a user ends up discovering by trial.

The alternative is the native lyrics tab, which needs no extension

The honest alternative is to use the lyrics tab YouTube Music already provides, and to accept whatever it shows.

The difference in approach is where the lyrics come from and who renders them. The native tab depends on the lyrics that YouTube itself holds for the track, which means the content is limited to what the service has, and it is rendered as part of the YouTube Music page. Better Lyrics instead reaches out to the lyrics providers you configure, fetches the text itself, and renders the lines as its own interactive elements in the page, with the seek-on-click behaviour, the translation and romanization layers, the theme support and the full screen presentation.

The trade-off runs the other way. The native tab has no permissions, no extension to update, nothing to break when YouTube changes its page, and no third party endpoint in the path. Better Lyrics brings a manifest with permissions, a code path that parses lyrics from external sources, and a match between the track and its lyrics that has to be right for the experience to work.

So the decision is not really about quality. If you want synced lines you can seek by, translations, or a lyrics source YouTube does not have, the extension is the only option in this comparison. If a plain read-along view is enough, the native tab costs you nothing and cannot fail.

GPL-3.0, and a v3 release line that moves every few days

The licence is GPL-3.0, with the badge in the README linking to the GNU GPL version 3 text and a LICENSE file at the repository root. For an end user installing a browser extension, the practical effect is limited to the distribution terms if you repackage it. For anyone who wants to read the code, or run a modified build for themselves, GPL-3.0 permits that.

The release picture is the thing to plan around. The recent tags are v3.0.0 on 2026-10-15, v3.0.0.5 on 2026-10-09 and v3.0.0.4 on 2026-10-01, and the last push to the repository was on 2026-10-22. The version recorded in package.json is 3.0.0, and the README badge shows 3.0.0 as well.

That is a v3 major line shipped recently, with patch releases inside it a few days apart. A v3.0.0 release and a v3.0.0.5 release in the same month suggests a lot of iteration on the new major version, and it also means the extension you install from a store listing may be a different build from the one in the repository on any given day.

Two structural notes for anyone tracking it. The v3.0.0.4 and v3.0.0.5 tags sit alongside the v3.0.0 tag rather than after it, which is a versioning shape worth watching, and the repository carries a CONTRIBUTING.md, an AGENTS.md, a STYLING-SKILL.md, a.greptile/ directory and a Graphite code review badge, which together suggest the project runs a fairly formal review process for contributions.

Editorial conclusion

Adopt Better Lyrics if you listen on YouTube Music and want lyrics you can seek by line, in a language the native tab does not offer, and if you are the kind of user who will point the extension at the lyrics providers that work for your region. Do not adopt it if you only need the lyrics YouTube already supplies, since the extension adds a dependency on external providers and a browser extension to your listening session. Before you install, read the extension permissions section and PRIVACY.md, because the project ships a manifest that grants permissions and the README states the extension needs no external dependencies or configurations, and set the provider list in the options after installing rather than assuming the default source works for every track.

Frequently asked questions

How do I use Better Lyrics in YouTube Music?

Open YouTube Music and start playing a song, click on the lyrics tab to view the time-synced lyrics, which can take a few seconds to load, and click a specific line to seek to that part of the song.

Does Better Lyrics work with any browser?

The extension is published for Chrome, Firefox and Edge, and the build tooling can target all of them, with the Chrome, Firefox and Brave development scripts in the npm scripts. The package is built with an extension build command that takes a browser argument.

Can Better Lyrics translate lyrics?

Yes. The features list translations and romanization for foreign language tracks, plus a user interface available in multiple languages. The translations are part of the extension, not a separate service you have to configure.

What options does the Better Lyrics popup have?

Settings are organised into tabs. The General tab shows Show logs enabled by default, Auto switch to Lyrics tab disabled by default, and a Cache Details entry. The Display tab has Blurred album art background and Full screen mode, both enabled by default.

What licence is Better Lyrics released under?

GPL-3.0, as the badge in the README and the LICENSE file at the repository root indicate. The recent releases are v3.0.0 on 2026-10-15, v3.0.0.5 on 2026-10-09 and v3.0.0.4 on 2026-10-01.

Official sources

  1. better-lyrics/better-lyrics on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/better-lyrics-better-lyrics.svg)](https://hysenlabs.com/projects/better-lyrics-better-lyrics)

Was this useful?