The platform to read manga endlessly.
mangaxr.app
-
Install Docker if you haven't already.
-
Clone the repository:
git clone https://github.com/Friedrich482/manga-xr.git- Install all necessary dependencies:
npm install- Generate the Prisma Client for your OS:
npx prisma generateCreate a .env.development file in the root of the directory with the variables DATABASE_URL,SESSION_SECRET, BROWSERLESS_URL and UPLOADTHING_TOKEN.
DATABASE_URL=...
SESSION_SECRET=...
BROWSERLESS_URL=...
UPLOADTHING_TOKEN=...For the DATABASE_URL, use
DATABASE_URL="mongodb://root:password@localhost:27017/mangaxr-dev?replicaSet=rs0&authSource=admin"(Local replica set for Prisma transactions, this is a docker volume, so the data will be stored locally)
For the SESSION_SECRET, you need to generate a SSH Key and get the fingerprint.
ssh-keygen -t rsa -b 4096Then create an accout on Uploadthing. Then get your keys. For the version 7.7.2, you will need UPLOADTHING_TOKEN
UPLOADTHING_TOKEN=...At the end the .env.development file should look to something like:
DATABASE_URL="mongodb://root:password@localhost:27017/database?authSource=admin&directConnection=true&replicaSet=rs0"
SESSION_SECRET="SHA256:..."
BROWSERLESS_URL="ws://localhost:3001"
UPLOADTHING_TOKEN=...Then serve locally:
npm run devYou also need the compose services for development. There are the browserless-dev service and a Mongo DB replica set, which is a docker volume required for prisma to run the transactions locally. To do so:
make dev-up # to start the services
make dev-down # to stop themFor more information about the commands available, check the Makefile
Prisma Studio to explore and manipulate the data:
npm run dev:studioTesting GUI with Vitest:
npm run test:uiThe services in the staging compose.yaml allow you to create a staging version on the application with three docker compose services: the app itself, a browserless instance and a MongoDB replica set for Prisma transactions.
Create a .env.staging file in the root of the directory with the variables DATABASE_URL,SESSION_SECRET, BROWSERLESS_URL and UPLOADTHING_TOKEN.
DATABASE_URL=...
SESSION_SECRET=...
BROWSERLESS_URL=...
UPLOADTHING_TOKEN=...For the DATABASE_URL, use
DATABASE_URL="mongodb://root:password@mongodb-primary:27017/mangaxr_db_staging?replicaSet=rs0&authSource=admin"For the SESSION_SECRET and UPLOADTHING_TOKEN, you can follow the same steps as in the .env.development
And for BROWSERLESS_URL, use:
ws://caddy:3000(the name of the compose service in the docker network)
You also need a WIREGUARD_PRIVATE_KEY and PROTONVPN_SERVER. Both of them can be obtained by creating a free proton vpn account and generating a wireguard configuration.
At the end, the .env.staging should look to something like:
DATABASE_URL="mongodb://root:password@mongodb-primary:27017/mangaxr_db_staging?replicaSet=rs0&authSource=admin"
SESSION_SECRET="SHA256:..."
BROWSERLESS_URL="ws://caddy:3000"
UPLOADTHING_TOKEN=...
WIREGUARD_PRIVATE_KEY=...
PROTONVPN_SERVER=...
IPCHECK_INTERVAL="0"
PROTONVPN_KILLSWITCH="false"
Then to open the staging version of the application:
make staging-up # to start the services
make staging-down # to stop themFor more information about the commands available, check the Makefile
Prisma Studio to explore and manipulate the data in staging environment:
npm run staging:studio- Change width : responsive width images or adjust the width
- Gap between the page with a range of possible gaps
- Progress Bar (pages read / total of pages)
- One single page or multiple pages
- Next/Prev pages button
- pages drop down
- Chapters dropdown
- Next/Prev chapter Button
- Reading direction (from left to right, from right to left, ...)
- Bookmark the chapter (authentication needed !)
- Add tests with vitest and / or cypress
- Don't forget to add placeholder for lazy loaded images
- Add a type for the cursor class
- Add the manga image in the db to display it in the history
- Create a single or two /lib functions to getUser / getUserId, one with redirect and the oter without it
- create a custom 404 page
- add buttons to reload fetching (for example popular, last released manga) when it fails
- create a separate file for swr tags and revalidateTag tags
- replace "altTitle" by "mangaSlug", which is a more suitable variable name
- BIG task: add history for the mangas with seasons, and also bookmarks support
- also history and bookmark support when the chapters names is not "chapter" but for example "episode"
- add a loading state for the bookmarking
- clear out the search form
- Break the massive zustand store into slices
- use the theme to get system for the theme if it is the case
- When user reaches the end of the last chapter, the next chapter button should lead to the mangaPage instead of being grayed out
- remove all the barrels
- can we use a generic function to represent all cleanup functions ?
- finish the dockerfile and optimize its size
- deploy on google cloud vm (temporary)
- fix the cache issues
- add an open graph image
- fix all tests and add all new tests (for the function sleep and the function clean)
- update the node version in the dockerfile from node 18 to node 20 (minimum)
- update all dependencies, and fix all lint errors
- get uploadthing working in production
If you want to contribute:
Fork the repo.
Then clone your fork to your local machine (replace <your_username> by your GitHub username) using:
git clone https://github.com/<your-username>/manga-xr.gitCreate a new branch
git checkout -b <new-branch-name>After making your changes, commit on your branch then submit a Pull Request.
MIT License © 2025



