NeoNexus
NeoNexus is NeoQN's community-powered reading list ecosystem. It lets you curate named folders of novels, share them with other readers as a single portable file, and import lists shared by others — bridging your personal library with the wider NeoQN community.
Why NeoNexus Was Created
Before NeoNexus, the only way to share a reading list was to manually list out titles in a chat or document and hope the other person could find every title in a provider. NeoNexus solves this by:
- Packaging a complete list as a structured
.neolistfile that encodes the provider name and source URL for every book. - Resolving each entry against your installed providers automatically on import, so you can open any book in the list with a single tap — no searching required.
- Supporting forward-compatible schema evolution so shared lists won't break when the app updates.
Creating a NeoNexus List
- Open the Library tab and select the NeoNexus category.
- Tap the + button to create a new folder. Give it a title and description.
- Open any novel's detail page, then tap Add to Library to add it to one of your existing folders.
- Tap 3 dots on folder to lock for Bookmarks , Share Neolist , Save on Device , Delete list.
Sharing and Importing Lists
Exporting (Sharing)
- Tap 3 dots on NeoNexus folder and press the Share NeoList option in the top options.
- NeoQN serializes the list into a
.neolistfile (a JSON document) and opens the Android share sheet. - Share it via Telegram, Discord, email, or any app on your device.
Importing
- Tap a
.neolistfile received from someone (via Telegram, Discord, etc.). NeoQN registers itself as the handler for this extension. - Alternatively, inside the NeoNexus hub, tap the Import button and pick a
.neolistfile from your storage. - NeoQN resolves every novel entry against your installed providers in the background. Successfully resolved novels display normally; novels whose provider is not installed show a "Provider Unavailable" chip with a Migrate button to search for an alternative.
If a shared list contains novels from a provider you don't have installed, tap Migrate to search for the same title across your active providers and re-link it.
NeoNexus Engine (Backend Specifications)
File Format
Every exported NeoNexus list is a JSON object conforming to the NeoListExport schema:
{
"schemaVersion": 1,
"id": "unique-uuid-string",
"title": "My Cultivation Picks",
"description": "Optional description here",
"coverUrl": "https://...",
"authorHandle": "@username",
"createdAt": 1720000000000,
"novels": [
{
"title": "Reverend Insanity",
"author": "Gu Zhen Ren",
"posterUrl": "https://...",
"apiName": "FicProvider",
"sourceUrl": "https://ficprovider.com/reverend-insanity"
}
]
}The file extension is .neolist and the hard cap is 200 novels per list.
Import Pipeline
Import is handled by NeoListImportExportEngine.importFromUri(), running entirely on Dispatchers.IO:
- The file is read via
Context.contentResolver.openInputStream(uri)(Scoped Storage compliant — direct path access is never used). - The JSON is deserialized using the global Jackson mapper with
FAIL_ON_UNKNOWN_PROPERTIES = falsefor forward compatibility. - Schema version is validated against
NEOLISTS_MAX_SCHEMA_VERSION = 1. Higher versions return aNewerVersionAvailableresult, prompting the user to update. - If a list with the same
idalready exists in the Room database, the result isAlreadySaved(no duplicate is created). - On success, the
NeoListEntityand itsNeoListPinMapare written atomically to the Room database and anImportResult.Successevent is emitted to the ViewModel'sSharedFlow.
Provider Resolution
After import, the NeoListDetailViewModel resolves each NeoListNovelEntry on Dispatchers.Default:
- Resolved:
getApiFromNameOrNull(entry.apiName)returns a non-null provider. - DeadProvider: No matching provider found. Triggers a visual "Provider Unavailable" badge and exposes the
Migrateaction to trigger a cross-provider title search. - Pending: Initial shimmer skeleton state before resolution completes.