Skip to main content
User Guide

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 .neolist file 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

  1. Open the Library tab and select the NeoNexus category.
  2. Tap the + button to create a new folder. Give it a title and description.
  3. Open any novel's detail page, then tap Add to Library to add it to one of your existing folders.
  4. Tap 3 dots on folder to lock for Bookmarks , Share Neolist , Save on Device , Delete list.

Sharing and Importing Lists

Exporting (Sharing)

  1. Tap 3 dots on NeoNexus folder and press the Share NeoList option in the top options.
  2. NeoQN serializes the list into a .neolist file (a JSON document) and opens the Android share sheet.
  3. Share it via Telegram, Discord, email, or any app on your device.

Importing

  1. Tap a .neolist file received from someone (via Telegram, Discord, etc.). NeoQN registers itself as the handler for this extension.
  2. Alternatively, inside the NeoNexus hub, tap the Import button and pick a .neolist file from your storage.
  3. 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.
Tip

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:

json
{
  "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:

  1. The file is read via Context.contentResolver.openInputStream(uri) (Scoped Storage compliant — direct path access is never used).
  2. The JSON is deserialized using the global Jackson mapper with FAIL_ON_UNKNOWN_PROPERTIES = false for forward compatibility.
  3. Schema version is validated against NEOLISTS_MAX_SCHEMA_VERSION = 1. Higher versions return a NewerVersionAvailable result, prompting the user to update.
  4. If a list with the same id already exists in the Room database, the result is AlreadySaved (no duplicate is created).
  5. On success, the NeoListEntity and its NeoListPinMap are written atomically to the Room database and an ImportResult.Success event is emitted to the ViewModel's SharedFlow.

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 Migrate action to trigger a cross-provider title search.
  • Pending: Initial shimmer skeleton state before resolution completes.