Library / SDK
xiyuesaves/lite-tools avatar
xiyuesaves/lite-tools

lite-tools trims and extends the QQ NT client, and says what v5 dropped

LiteLoaderQQNT/QwQNT 插件 - 轻量工具箱

1,333 stars50 forksTypeScriptAGPL-3.0

At a glance

What is it?
An open source plugin for the LiteLoaderQQNT and QwQNT loaders that hides interface elements, intercepts message recall, adds a local sticker panel, and in v5 deliberately gives up a large part of what v4 did.
Who is it for?
Adopt lite-tools if you run QQ through a LiteLoaderQQNT or QwQNT loader and want a quieter client with local stickers, and if you are prepared to rebuild it when the client changes.
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 7 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 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the project is: a client plugin with a settings page

lite-tools is a plugin for two loaders, LiteLoaderQQNT and QwQNT, which are unofficial modding layers for the QQ desktop client. The project describes itself in three words, light, elegant and efficient, and the README is in Chinese with the title Lite Tools v5. Its shape is that of a desktop client modification rather than an application: it injects itself into the running client, adds a settings entry, and changes the behaviour and appearance of the interface.

The feature list is long, and it is organised by what it touches. Interface adjustments hide or change things such as the weather button, the classic mode toggle, the lock button, the log out button, the update check button and update notifications, VIP coloured nicknames, and message bubble decorations. Message related options remove the reply at mention, replace mini program cards with web cards, lift a shop emoji restriction, let you react with a plus one, and show the send time of every message with timezone and configurable time and date formats. Then there is a group of features for blocking message recall, a local sticker panel with drag and drop ordering and Telegram sticker downloads, a custom background with opacity and blur controls, and a set of trimming options for the sidebar, the top function bar and the chat function bar.

What all of it has in common is that it operates on a client you did not write, using hooks into the client's own renderer and IPC, and the project states in its own disclaimer that everything is developed for learning and should not be used illegally or commercially.

The plugin also asks users not to promote it on domestic platforms, and not to post screenshots in official QQ group chats that obviously reveal the use of a third party plugin. That request says something about the environment this software lives in.

How it attaches to the client: injected renderer, preload and IPC dependencies

The mechanism is visible in the package manifest. The plugin declares itself as a qwqnt plugin with a Chinese display name and an inject block that names two entry points, a renderer script at ./dist/renderer/index.qwq.js and a preload script at ./dist/preload/index.js, plus a main entry at ./dist/main/index.js. The renderer is where the interface changes happen, and the preload is the part that can reach Node APIs from the page.

The dependencies listed under the qwqnt block are the interesting part, because they are not ordinary npm libraries. The plugin depends on qwqnt-ipc-interceptor, on qwqnt-hako, and optionally on qwqnt-ipc-logger, with a question mark in the key marking the optional one. The README names the same pieces as prerequisite plugins that must be installed separately depending on which loader you use: for QwQNT, qwqnt-hako and ipc-interceptor, and for LiteLoaderQQNT, ipc-interceptor.

So the architecture is a two layer one. A loader lets a plugin run inside the client, and an interceptor library lets that plugin observe and modify the client's internal RPC traffic, which is what makes the recall blocking and the shop emoji change possible at all. Reading a message back after the server has already told the client it was recalled is not something a stylesheet can do; it needs the IPC layer. That also explains the honest limits of the project: the behaviour it changes belongs to a client that Tencent updates on its own schedule, and a client update can change the internal protocol the interceptor depends on.

The rest of the dependency set is small and conventional: lit for rendering, undici for HTTP, and on the build side esbuild, sass, typescript, ts-node, chokidar, adm-zip and electron, with pnpm 10.32.1 as the declared package manager.

Installing it, and building it yourself

The supported path is a release archive. The README says to download the archive for the matching version from Releases, unzip its contents into the loader's data directory under a plugins/lite-tools folder, and then restart QQ and enable and configure the plugin from the plugin settings. The current build artefact naming is given as lite-tools v<version>.zip, and the releases page it links is under the LiteLoaderQQNT-lite_tools repository name rather than this one.

Building from source uses these commands:

bash
git clone [email protected]:xiyuesaves/lite_tools.git
cd lite_tools
pnpm install
pnpm run build

An alpha build uses a separate script:

bash
pnpm run build:alpha

The package scripts show how the build is wired. build and build:alpha both run a TypeScript build script with ts-node, the second with an --alpha flag, and dev runs the same script in watch mode. A separate check:types script runs tsc in build mode emitting declarations only, which is how the type check is kept separate from the bundling.

One inconsistency in the manifest is worth noting before you build. The version field reads 4.0.0-alpha.dev while the release tags are 4.0.x and the README describes the current line as v5, and the repository URL points at the dev/v5 branch. The branch, the version number and the release tag are therefore not in step, which is normal for a project that renumbers its major line inside a development branch, and confusing if you are trying to map a released zip to a commit.

The feature groups in detail, and the ones that change platform behaviour

Most of the feature list is presentational. The sidebar trimming options control the top and bottom sidebar separately, and the manageable items include messages, contacts, more, palette, mail, file manager, favourites and my phone, with a warning that the more entry usually contains the settings shortcut, so hiding it can leave you without a way to reach the settings page. The top function bar and the chat function bar are read automatically the first time you enter a group chat or a private chat, and only then appear in the settings page, which is a small implementation detail with a real effect: a feature you cannot find is usually a feature you have not opened the right screen yet.

The background options accept a single image or a video, remove the background mask, adjust media opacity and foreground container opacity separately, and can enable a frosted effect for the contact list, the group member area, message bubbles and the input box. The local sticker panel has a directory picker, drag and drop ordering of sticker sets, sending stickers as images, a configurable number of columns, panel width and height, Telegram sticker download with a Telegram bot token, paths for ffmpeg and tgsToGif, and an HTTP proxy setting with an availability check.

The recall blocking group is the one that is not a cosmetic preference. It intercepts recall messages, can optionally intercept your own recall actions, persists the records locally, redirects the saved image path, lets you open the redirect directory, customises the notice colour, clears the local cache and lists the intercepted messages. The mechanism is straightforward in principle: the interceptor stops the client from removing the message it has already received. The consequence is that the client and the server no longer agree about what is on screen, and the README asks for the feature to be used for learning and not for illegal or commercial purposes, which is the disclaimer a project like this needs.

v5 is a reduction, and the README treats that as a feature

The most unusual thing about this project is its stance on removing functionality. The note near the top says that v5 is a refactored and reduced version, and that many historical features were removed compared with v4. The section at the end says it explicitly: v5 no longer tries to cover all the historical capabilities of v4, it keeps the part that is still maintained and that fits the current structure.

For a user migrating from v4, the README pre-emptively says that missing old features are expected behaviour and not an omission in the documentation. That is a deliberate position. Most plugins accumulate features until the surface is too large to maintain against a changing host application, and a rewrite that drops the unsupported half is a defensible way to keep the remaining half working.

The other part of the project's honesty is about the current state. The tip note says the branch is still under active development, and that features and compatibility should be judged from the actual releases, the settings page and the commit history rather than from the README. That is an unusual instruction to publish, and a useful one: a plugin like this is defined as much by the client version it happens to work with as by its own code.

The acknowledgement section notes that the project uses the rkey interface of LLOneBot, which places one external dependency inside the plugin rather than in the loader ecosystem.

Licence, ecosystem and the limits of a client modification

The licence is AGPL-3.0, and the manifest records it as AGPL-3.0-only, with the LICENSE file at the root. AGPL is the copyleft licence that requires source availability for network use as well, and it is a natural fit for a community maintained plugin. The disclaimer adds that the project is free and open source, maintained jointly by the open source community, and that contributors keep the rights to their own contributions.

The limits of the approach are structural rather than fixable by a better implementation. A plugin that depends on intercepting the client's internal IPC breaks when the client changes, and the client is updated by its vendor on a schedule the project does not control. A plugin that hides buttons depends on the selectors of a UI it does not own. The manifest's optional qwqnt-ipc-logger dependency and the two required interceptor libraries show how much of the project sits on that seam.

The second limit is a policy one. Modifying a proprietary client to keep messages the platform has decided to delete, to remove commercial elements such as the VIP nickname colouring, or to bypass the shop emoji restriction, may violate the terms of the platform, and the project itself asks users to keep the tool to learning and to avoid promoting it in visible places. Any use of this plugin inside a workplace where message retention is governed by policy is a decision for that organisation rather than for the plugin author.

There is also no homepage for the project, the releases live under a different repository name, and the version numbering has drifted between the branch, the manifest and the tags. None of that is a technical problem, but it makes the project harder to evaluate from the outside than a small plugin with a single page of documentation and a stable release channel.

Editorial conclusion

Adopt lite-tools if you run QQ through a LiteLoaderQQNT or QwQNT loader and want a quieter client with local stickers, and if you are prepared to rebuild it when the client changes. Do not adopt it if the recall interception is a hard requirement in a work context, since it deliberately contradicts the platform's behaviour, or if you need a documented, stable plugin API, because the README states the v5 branch is still under active development and the settings page is the source of truth. Verify first by installing the release zip into the loader's plugins/lite-tools folder, then reading the settings page in the client, since features are only visible there after the corresponding screen has been opened once.

Frequently asked questions

How do I install the lite-tools plugin?

Download the archive for the matching version from the Releases page, unzip its contents into the loader's data directory under a plugins/lite-tools folder, then restart QQ and enable and configure the plugin from the plugin settings. The build artefact is named lite-tools v<version>.zip.

Which prerequisite plugins does lite-tools need?

It depends on the loader. For QwQNT you need qwqnt-hako and ipc-interceptor, and for LiteLoaderQQNT you need ipc-interceptor. The manifest lists qwqnt-ipc-interceptor and qwqnt-hako as required dependencies and qwqnt-ipc-logger as optional.

How do I build lite-tools from source?

Clone the repository, run pnpm install, and then run pnpm run build. An alpha build uses pnpm run build:alpha, and pnpm run dev starts the build script in watch mode. The package declares pnpm 10.32.1 as its package manager.

Why did a feature I used in v4 disappear in v5?

The README says v5 is a reduced rewrite that keeps the features still being maintained and that fit the current structure, and it no longer aims to cover all of v4's historical capabilities. Missing v4 features are expected behaviour rather than a documentation omission, and the branch is still under active development.

What does the recall blocking in lite-tools actually do?

It intercepts recalled messages through the IPC interceptor so the client does not remove them, can optionally block your own recall actions, persists the records locally, redirects the saved image path and lets you list the intercepted messages. The project states that all development is for learning and asks that the plugin not be used illegally or commercially.

Why can I not find the top function bar options in the lite-tools settings?

The top function bar and the chat function bar are read from the client only after you have entered a group chat or a private chat once. Until then the plugin has no list to show, so the settings page stays empty for those two sections.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. README
  4. Releases
  5. xiyuesaves/lite-tools on GitHub
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/xiyuesaves-lite-tools.svg)](https://hysenlabs.com/projects/xiyuesaves-lite-tools)

Was this useful?