reMarkable Import manages documents and folders on a reMarkable tablet over SSH. The project now exposes a logical file model instead of raw metadata files, which makes it a better base for a future web UI.
In theory it should work across the full reMarkable product line, but it has only been tested on the reMarkable Paper Pro Move.
- List the logical tree of folders and documents.
- Create folders or nested folder paths.
- Upload
.pdfand.epubdocuments. - Download documents.
- Delete documents.
- Delete folders, including recursive delete for non-empty folders.
- Move documents or folders into another folder.
- Resolve targets by UUID or logical path.
- Python 3.8 or later
paramiko- SSH access to the reMarkable tablet
pip install -r requirements.txtCopy config.example.json to config.json, then fill in your own connection details:
{
"host": "10.11.99.1",
"username": "root",
"password": "your-password",
"xochitl_path": "/home/root/.local/share/remarkable/xochitl"
}Field description:
host: IP address or hostname of the reMarkableusername: SSH usernamepassword: SSH passwordxochitl_path: Path to the reMarkablexochitlstorage directory
config.json is ignored by Git so your local password is not committed.
General syntax:
python upload.py <command> [options]python upload.py listShow folders only:
python upload.py list --folders-onlyShow UUIDs together with logical names:
python upload.py list --show-uuidExample output:
(root)
ββ Books/
β ββ Math/
β β ββ Linear Algebra (pdf)
β ββ Physics (epub)
ββ Notes/
Create a folder at root:
python upload.py mkdir BooksCreate nested folders in one command:
python upload.py mkdir Books/Math/AlgebraCreate under an existing parent by UUID or logical path:
python upload.py mkdir Algebra --parent Books/MathUpload to root:
python upload.py upload ./sample.pdfUpload with a custom visible name:
python upload.py upload ./sample.pdf --name "Linear Algebra Notes"Upload into a folder by logical path:
python upload.py upload ./sample.pdf --parent Books/MathUpload into a folder by UUID:
python upload.py upload ./sample.pdf --parent 12345678-1234-1234-1234-123456789abcDownload using a logical path:
python upload.py download Books/Math/"Linear Algebra Notes"Download to a specific local file path:
python upload.py download Books/Physics ./downloads/physics.epubDelete a document:
python upload.py delete Books/Math/"Linear Algebra Notes"Delete an empty folder:
python upload.py delete Books/Math/AlgebraDelete a non-empty folder recursively:
python upload.py delete Books --recursiveMove a document into another folder:
python upload.py move Books/Physics NotesMove a folder into another folder:
python upload.py move Books/Math ArchiveStart the local web interface:
python webapp.pyThen open http://127.0.0.1:8000.
The web UI currently supports:
- Single-directory browsing, starting at root
- Enter folder on click and go back to parent
- Batch upload into the current folder by drag-and-drop or file picker
- In-page folder creation in the current folder
- Rename folders or documents
- Batch delete using row checkboxes
- Download, move, and rename based on the selected item
- Upload progress feedback
- English and Chinese UI switching
You can also choose a custom bind address and port:
python webapp.py --host 127.0.0.1 --port 8765- The CLI works on the logical tree reconstructed from item metadata, not on raw
.metadatafilenames. - By default,
listhides UUIDs so the output stays focused on the logical structure. - After write operations, the script restarts the
xochitlservice so changes appear on the device. - Before restarting
xochitl, the client resets the unit's failed state to reduce the chance of hitting the device's systemd start limit during repeated operations. - Only
.pdfand.epubuploads are supported. - Ambiguous logical paths are rejected instead of guessing.
upload.py: CLI entry pointremarkable/client.py: Core logical operations for list, upload, download, move, delete, and mkdirwebapp.py: FastAPI web servertemplates/andstatic/: Web UI templates and assetsrequirements.txt: Python dependenciesconfig.example.json: Config templateconfig.json: Local config, ignored by Git