Model or dataset
pa-jesusf/KikoFlu avatar
pa-jesusf/KikoFlu

KikoFlu and a cross-platform client for doujin audio libraries

Kikoeru Flutter ASMR player app, 跨平台同人音声客户端

701 stars30 forksDartGPL-3.0

At a glance

What is it?
KikoFlu is a Flutter client for doujin audio libraries, connecting either to a self-hosted Kikoeru server or to an online service, with a subtitle system, a searchable library and downloads for every desktop and mobile platform. It is GPL-3.0, actively released through August 2026, and the interesting engineering is in the subtitle pipeline rather than the player.
Who is it for?
KikoFlu is a good fit for a listener who wants a single client across Android, iOS, Windows, macOS and Linux and who cares about subtitle handling, since the library indexes subtitles in SQLite and supports a long list of subtitle formats with import, editing and time shifting.
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 34 days ago.
What is it written in?
Mainly Dart, according to GitHub's language statistics.

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

Editorial analysis

One client, two possible backends

KikoFlu is a cross-platform client for doujin audio, described in the project description as a Flutter app for playing ASMR material, and it can connect to a Kikoeru self-hosted server or to an online service. Those two backends are the fork in the road for any user.

The self-hosted option points at Kikoeru, which the README lists as a related project, a self-built backend server, and there is a usage guide for the self-built server linked from the settings section where the custom server address is configured. The other option is asmr.one, listed as the online service.

The settings screen exposes a custom server address field, and the README notes you can test the connection latency from there. That latency test matters more than it sounds. A client that streams over the network behaves differently from one reading a local file, and knowing which one you are on before you start a long download is the difference between a reasonable wait and an unexplained stall.

The project also supports multiple accounts, so one install can carry more than one login.

The audience is a listener with a large personal library who wants the same interface on a phone and a desktop, and who has accumulated subtitle files that the original format does not handle.

The subtitle system is the part worth reading about

Most media clients treat subtitles as a checkbox. KikoFlu treats them as a subsystem, and it is the most substantial part of the feature list.

There is automatic subtitle loading, so a downloaded item finds its own subtitle without the user pointing at a file. There is import, editing and time shifting, which is the ability to nudge a subtitle's timing when it drifts out of sync with the audio. There is full screen display for lyrics and subtitles, and a translation feature that works during playback, translating lyrics or dialogue in real time. The player can translate the subtitle currently on screen and show the result immediately, and then save it.

The format list is long: .vtt, .srt, .lrc, .txt, .ass, .ssa, .sub, .idx, .sbv, .dfxp and .ttml. The .ass and .ssa entries matter for anime-style subtitles with styling, the .lrc entry is the timed lyrics format used in music, and .vtt is the web format.

Underneath there is a subtitle library indexed in SQLite for fast retrieval, with a configurable priority order so you can decide which file wins when several exist for the same item, and support for changing the save directory so the library can be moved across drives.

Translation is also applied outside the player. Titles, file directory names and text files can be translated, and tags are translated automatically between Chinese, English and Japanese.

That subtitle pipeline is where a user will actually feel the difference between this client and a plain file browser, and it is also where bugs will be found, since each format has its own quirks.

Playback features and the interface, including a deliberately odd mode

The playback side is conventional and complete: background playback with an automatic caching mechanism, a mini player, persistence of the play queue and of playback progress, speed control, and three repeat modes for single track, list and shuffle. There is also a global audio gain with both attenuation and boost.

One feature stands out as a beta: audio haptic feedback, where on mobile the device vibrates according to the characteristics of the sound. It is labelled beta, which is the right amount of caution for something that maps audio to a motor.

The media support is broader than audio. Video, text, images and PDF files are all handled, and the library can hold an entire work or a selected subset, with concurrent download management for that. Downloaded content is searchable and sortable offline, and the app can import work metadata from a local source.

The interface follows Material Design 3, supports landscape, and adapts to light and dark themes. There is a liquid glass navigation bar and mini player, enabled by default on Apple platforms running version 26 and above, with a compatibility mode elsewhere.

The feature that will get attention is the anti-embarrassment mode, which in a context where people listen to this material in public is self-explanatory: it hides what is playing until the user decides otherwise. There is also a rating system and a recommended works feature.

Search, internationalisation and the settings surface

Search is more than a text box. Advanced search supports multiple tags and tag exclusion, and there is multi-dimensional filtering by tag, rating and release date, alongside full work information display.

The interface languages are Simplified Chinese, Traditional Chinese, English, Japanese and Russian, and the app supports multiple forms and multiple languages in translation. The translation target language can be set separately, and an LLM mode is supported with a custom target language, which is how the real-time subtitle translation gets its capability.

The settings list is where a lot of the behaviour actually lives. Beyond the custom server address and latency test, there is a configurable cache size limit with a cleanup policy, theme mode and colour scheme selection, subtitle library priority, audio format preferences, and preloading and audio gain playback settings. There is an in-app logging system with export, and an update check.

For a client that can hold a large library, the cache controls are the most consequential. A cache size limit with a defined cleanup strategy is what keeps a client that also stores offline downloads from filling a disk, and the fact that it is exposed rather than fixed is the difference between a tool you can live with and one you have to keep an eye on.

Floating subtitles and mobile peculiarities

There is a floating subtitle mode, and it is supported on all five platforms, Android, iOS, Windows, macOS and Linux.

The platform differences are worth spelling out. On Android the floating window can be locked or unlocked, and touch-through is available so the overlay does not swallow taps meant for the app behind it. On the desktop platforms the same click-through behaviour is offered. On iOS the floating subtitles use the system picture-in-picture display instead, which is the platform's own mechanism rather than a custom overlay window.

That difference is not an inconsistency in the project so much as a reflection of what each platform allows. An overlay window that draws above everything else is a different thing from a system picture-in-picture surface, and on iOS the latter is what the system provides.

For a listening app, floating subtitles are a real feature rather than a novelty, since the point of reading along with a track is often to keep the text visible while doing something else, and a full screen player is not that.

Building from source and the platform story

The source build needs the Flutter SDK 3.44.1 or later and the Dart SDK 3.12.1 or later, and the clone is straightforward:

bash
git clone https://github.com/pa-jesusf/KikoFlu.git
cd KikoFlu
flutter pub get

The build commands are per platform. Android is flutter build apk --release --split-per-abi, Windows is flutter build windows --release, macOS is flutter build macos --release, Linux is flutter build linux --release, and for iOS the project ships a script called build_ios_xcode.sh which you run directly.

The published binaries cover a wide matrix. Android ships as a universal build and as arm64-v8a, iOS ships as an unsigned IPA, Windows as an installer and as a portable version, macOS as a DMG, and Linux as x64 and arm64.

The unsigned iOS build is the detail that will trip up an iOS user. Because the artifact is not signed, it cannot be installed from the App Store or a normal TestFlight path, and the README points iOS users at AltStore and SideStore, with a source manifest hosted in the repository at altstore-source.json. Both of those tools handle re-signing on the device, which is the intended installation path.

The repository also carries platform tooling beyond the app itself: an .fvmrc pinning the Flutter version, an analysis_options.yaml and a devtools_options.yaml for the Dart tooling, an installer_script.iss which is an Inno Setup script for the Windows installer, and per-platform shell scripts for Linux, macOS and iOS builds.

Release cadence and what the licence means here

The repository is not archived and the last push was on 2026-09-19. The recent releases are v3.8.2 from 2026-08-30, v3.8.1 from 2026-08-24 and v3.8.0 from 2026-08-23, which is a steady patch-level cadence for a client application that ships to five platforms and has to keep up with each one's build tooling.

The licence is GPL-3.0, and for an application rather than a library that is a simple statement. The distributed app is covered by the GPL, which matters if you intend to modify and redistribute it. The README points at the LICENSE file and describes the project as a cross-platform doujin audio client.

One structural point for anyone integrating it. The client is a front end, and it needs something behind it. Either you run a Kikoeru server yourself, or you use the online service. The client alone is not a library that embeds into another product, and the README describes it as an application with a release download and a build script rather than a package to add to a dependency list.

The build system underneath is Flutter with Dart, so the platform code is shared and only the packaging differs, which is why one codebase reaches Android, iOS, Windows, macOS and Linux.

Editorial conclusion

KikoFlu is a good fit for a listener who wants a single client across Android, iOS, Windows, macOS and Linux and who cares about subtitle handling, since the library indexes subtitles in SQLite and supports a long list of subtitle formats with import, editing and time shifting. It is a poor fit if you need a signed iOS build, because the published iOS artifact is an unsigned IPA and installation goes through AltStore or SideStore, and a poor fit for a listener who needs continuous background syncing with a server. Before installing, decide whether you will point it at a self-hosted Kikoeru instance or the online service, check the build you download matches your CPU architecture, and read the format list if your library relies on a subtitle type outside the common ones, since subtitle import and time shifting are the features most likely to need adjusting.

Frequently asked questions

How do I install KikoFlu on iOS?

The published iOS build is an unsigned IPA, so it is installed through AltStore or SideStore by adding the source manifest the project hosts in the repository. The README documents the source address for that.

Can KikoFlu connect to a self-hosted server?

Yes. The custom server address setting points the client at a Kikoeru instance you run yourself, and the README includes a usage guide for the self-built server plus a connection latency test in the settings.

Which subtitle formats does KikoFlu support?

The README lists .vtt, .srt, .lrc, .txt, .ass, .ssa, .sub, .idx, .sbv, .dfxp and .ttml, with import, editing, time shifting, a SQLite-indexed subtitle library, and real-time translation during playback.

How do I build KikoFlu from source?

You need the Flutter SDK 3.44.1 or later and the Dart SDK 3.12.1 or later, then clone the repository, run flutter pub get, and use the per-platform build command such as flutter build windows --release or the build_ios_xcode.sh script for iOS.

Official sources

  1. Issues
  2. License: GPL-3.0
  3. pa-jesusf/KikoFlu on GitHub
  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/pa-jesusf-kikoflu.svg)](https://hysenlabs.com/projects/pa-jesusf-kikoflu)

Was this useful?