Library / SDK
amll-dev/applemusic-like-lyrics avatar
amll-dev/applemusic-like-lyrics

The lyric player that documents its own frame rate on a five-year-old processor

An Apple Music style lyric player component, with React & Vue support. 一个类 Apple Music 歌词显示组件,同时提供 React 和 Vue 绑定。

2,152 stars204 forksTypeScriptAGPL-3.0

At a glance

What is it?
The component's distinguishing feature is honesty about cost: a readme that states which browser versions render the effects fully, which two CSS properties are responsible, and how much processor and graphics capability you need for a given frame rate. That is more useful to an integrator than a demo video, and it is the section to read first.
Who is it for?
Adopt AMLL if you are building a music player and want per-syllable lyrics that scroll and highlight the way a native player does, since the parsing module handles four syllable lyric formats and the DOM core means you are not locked to a framework.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 6 days 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 1, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The performance section is the most valuable page in the readme

Most component readmes show you what it looks like. This one tells you what it costs. Three claims, in order of specificity. Mainstream processors from the last five years can run the lyric component at thirty frames per second. For a smooth sixty, the processor clock should be at least three gigahertz. For a hundred and forty-four frames or above, four point two gigahertz. Then graphics: full sixty frames at the expected sizes needs a particular card class at full high definition, and a higher class at ultra high definition. None of this is a benchmark you can reproduce from the readme, because the readme does not describe what is being animated, on what page, with how many lines of lyrics, or how the frame rate was measured. But the shape of the claim is informative. A component that needs a discrete graphics card to animate a wall of text is not doing text layout; it is compositing something expensive, most likely the fluid background effect, which is a second component and a separate concern from the lyrics themselves. The practical reading is that the lyric display and the background are priced separately in your head even though they ship in the same library, and the readme's second browser tier exists for the same reason: the full effects need newer browsers, and the difference is two named CSS properties.

Two CSS properties explain the browser requirement gap

The readme is unusually good at explaining why a requirement exists rather than just listing it. It gives two tiers. For the component to run at all, a minimum Chromium and Edge version, a minimum Firefox version and a surprisingly old minimum Safari version, which is worth pausing on, since that is older than most tools will claim to support. For the full visual effects, a much newer Chromium, the same Firefox, and a newer Safari. Then, instead of leaving you to guess, it links two browser compatibility database entries, and those two links are the explanation. One is a mask-image property and the other is a blend mode with an additive lightening variant. Both are CSS features that Safari shipped late and that Chromium shipped in a recent version, and both are exactly the kind of thing you would use for the effect this component is imitating. Masking is how you clip a highlight to a word, and an additive blend mode is how you get a glow that brightens what is behind it. So the browser story is coherent: an older browser gets you a working lyric display with the mask and glow missing, and a current browser gets the full effect. That is the right way to ship a visual component, and the compatibility links are the reason you can predict the degradation.

Four packages, and the fourth is the one you may want on its own

The main modules are four, and the structure is a text-to-rectangle pipeline with a framework binding at the end. The core package is written natively against the document object model and provides the lyric display component plus a dynamic fluid background component, so the framework-free layer is the real implementation and the bindings are thin. The React package and the Vue package each provide the same two components as framework components. That is three packages for one feature set, and the reason to structure it this way is that a music player on the web is often a React app, an embedded web view inside a native app, or a page with no framework, and the same visual result is wanted in all three. The fourth package is different in kind: a lyric parsing module, providing parsing and serialisation for several formats, and the readme names four of them, three identified by their industry abbreviations and one identified by the tool that produces it. That package is independent of rendering, which means you can use it to convert between lyric formats without touching the component. For anyone with a lyric database and a player, that is often the more valuable half of the repository.

Building with a task runner, a workspace catalog, and a pinned package manager

Building from source takes a Node runtime, the pinned package manager, and two commands:

bash
pnpm install
bash
pnpm run build:libs

The build section assumes a Node runtime and a specific package manager, and the repository layout confirms a modern workspace setup. The root manifest is private, declares the module type, and pins an exact package manager version. Its scripts are thin wrappers around a task runner: build the libraries runs the runner across everything tagged as a library, test runs it across three named projects, and format and lint both call a single formatter and linter in write and fix modes, with separate continuous-integration variants that do not fix anything. That last detail is the mark of a repository with real continuous integration, because a fix-mode lint script is a development tool and an error-on-warnings variant is a gate. The dependency list is unusual in two ways worth noting. Most entries come from a workspace catalog rather than pinned versions, so a version is declared once and inherited, which is the standard way to keep a monorepo's packages on the same toolchain. And one entry is a development preview build of the TypeScript compiler itself, pinned to a dated nightly, which is a fast-moving target that a project has chosen to sit on. Single-package builds go through the task runner by project and target name, with a development variant available, and there is a patches directory, meaning some dependencies are modified in place.

A project asking for maintainers, and a release tag that is not a version

Two governance details sit at the top and neither is decorative. The first is a badge saying the project is looking for maintainers, and a callout repeating it: the project has one active maintainer with limited bandwidth, and it links a recruitment issue and a contribution guide, plus two community chat links. A single-maintainer library that says so in the header is being more useful than one that fails silently, and the fact that the badge is next to the project logo means you see it before you read anything. The second is the release history. The three most recent tags are named for branches rather than versions, with descriptions like a player update placeholder and a development build of the latest main branch, and the newest of them is dated well before the last push. So the tags are not a version history you can pin to; they are snapshots of a build. For a component you embed in an application, that means you should pin a commit rather than a tag, and it means the readme's own version numbers, which it does not give, would have come from the package registry. The licence is the copyleft variant with the only-option clause, which is the strictest reading of that family, and the acknowledgements credit a processing library and a media tool, both of which are things you would expect to find in a project that does audio and video work alongside the lyrics.

Editorial conclusion

Adopt AMLL if you are building a music player and want per-syllable lyrics that scroll and highlight the way a native player does, since the parsing module handles four syllable lyric formats and the DOM core means you are not locked to a framework. Do not adopt it without reading the performance section, because the readme says thirty frames per second on a mainstream processor from the last five years and asks for a specific clock speed for sixty, which tells you this is a graphics-heavy component. Four things to verify. Which licence you can live with, because it is the copyleft variant with the only option clause, and a lyric display in your product is a distribution question rather than an internal-use one. Whether the browser floor fits your users, since there are two tiers, a minimum for the component to work at all and a higher one for the full effects, and the difference between them is two CSS properties. Whether the parse formats match your content, since syllable-level timing needs per-word data and most lyric sources are line-level. And who maintains it, because the readme carries a badge looking for co-maintainers and says there is one active maintainer with limited bandwidth. The last push was on 2026-09-25 and the release tags are development placeholders rather than versions.

Frequently asked questions

What does the AMLL lyric component library provide?

Four packages: a core library written against the document object model providing a lyric display component and a dynamic fluid background component, React and Vue bindings for both, and a separate lyric parsing module supporting parsing and serialisation for four syllable lyric formats.

What are the browser requirements for AMLL?

Two tiers. A minimum of a recent Chromium and Edge, a minimum Firefox, and a much older minimum Safari for the component to work at all. Higher versions are required to render all effects fully, and the readme attributes the gap to two specific CSS properties, a mask-image property and an additive blend mode, linking compatibility data for both.

What hardware does AMLL need?

The readme states that mainstream processors from the last five years run the component at thirty frames per second, that a clock speed of at least three gigahertz is needed for smooth sixty, and at least four point two for a hundred and forty-four frames. For graphics it names a card class for full sixty frames at full high definition and a higher class at ultra high definition.

How do I build AMLL from source?

Install a Node runtime and the package manager the project pins, clone the repository, install dependencies, and run the production build command for all library packages. To build one package, run the task runner with the project and target name, and a development build target is also available.

Who maintains the AMLL project?

One active maintainer with limited bandwidth, according to a badge and a callout in the readme, which links a maintainer recruitment issue, a contribution guide, and two community chat servers. The recent release tags are branch snapshots with placeholder descriptions rather than version numbers, so pinning a commit is safer than pinning a tag.

What licence is AMLL released under?

AGPL-3.0-only, the copyleft variant with the only-option clause, declared in the root package manifest. The last push to the main branch was on 2026-09-25.

Official sources

  1. amll-dev/applemusic-like-lyrics on GitHub
  2. License: AGPL-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/amll-dev-applemusic-like-lyrics.svg)](https://hysenlabs.com/projects/amll-dev-applemusic-like-lyrics)