remarkapy
A Python package for interacting with the reMarkable Cloud API.
Quickstart
from remarkapy import Client
client = Client()
items = client.list_items()
for item in items[:5]:
print(item.type, item.visibleName, item.parent, item.id, item.hash)
Use client.list_items() for cheap library scans and lookup workflows.
client.list_hydrated_items() is the explicit full-hydration variant and
fetches each item's manifest, metadata, and .content blob.
Download a raw bundle:
from remarkapy import Client
client = Client()
first = client.list_items()[0]
client.download_raw_bundle(first.hash, "bundle.zip")
Upload a PDF:
from remarkapy import Client
client = Client()
with open("example.pdf", "rb") as handle:
created = client.put_pdf("Example.pdf", handle.read())
print(created)
CLI examples:
uv run remarkapy init
uv run rkpy ls
uv run rkpy ls Papers/
uv run rkpy ls -r Papers/
uv run rkpy get Papers/Example.pdf
uv run rkpy get Papers/Example.pdf --output ./Example.pdf
uv run rkpy get "Meeting Notes" --format bundle
uv run rkpy export "Meeting Notes" ./exports --format pdf
uv run rkpy info Papers/Example.pdf
uv run remarkapy get-id <item-id-or-hash>
uv run rkpy put-pdf ./example.pdf --parent Papers/
uv run rkpy mkdir Inbox
uv run rkpy rename Papers/Example.pdf "New Name"
uv run rkpy move Papers/Example.pdf Inbox/
uv run rkpy trash Papers/Old Draft.pdf
Why another
As far as I can tell, the major reMarkable client SDKs have all suffered from API churn.
rmapyis archived.rmapiis archived (but resurrected??)- reMarkable continues to change endpoints and backend behavior.
remarkapy aims to stay useful by:
- discovering the current public webapp/raw hosts at runtime,
- supporting the current immutable-manifest sync protocol,
- exposing a clean Python library API first,
- keeping real integration tests available behind an explicit opt-in flag.
Optional export backends
remarkapydoes not render annotations itself.- Install the
remarkscommand separately if you want export support (for example:uv tool install git+https://github.com/avncharlie/remarks.git). rkpy exportshells out to that installedremarksexecutable by default, but--remarks-cmdstill lets you override it.- For single-file PDF/Markdown exports, you can pass an exact output file path like
./notes.pdf; otherwise pass an output directory. remarksneeds the system Cairo library for PDF rendering; on macOS install it withbrew install cairo.- Export output is staged in a temporary bundle and copied back into your requested output directory.
Features
- Base authentication and device-token reuse
- Endpoint discovery
- List documents and folders
- Download original PDFs and EPUBs
- Download raw item bundles as zip archives
- Upload PDFs and EPUBs
- Create folders
- Rename items
- Move items
- Delete items by moving them to trash
- Mock-backed pytest suite
- Read-only live-account smoke tests
Roadmap
- Download annotated PDFs rendered by the service, if available
- Add a small CLI wrapper for common operations
- Add safer live mutation tests using temporary fixtures
- Add sync-to-directory and sync-from-directory helpers
- Add device registration from a dedicated command-line flow
Testing
Dangerzone Safety
There are live tests in this repo that interact with the real reMarkable Cloud API. These tests are marked with the live pytest marker and are skipped by default to prevent accidental mutations of real accounts.
The live tests in this repo are intentionally read-only by default.
To run them, opt in explicitly:
REMARKAPY_RUN_LIVE=1 uv run pytest -q -m live
The destructive paths (rename, move, delete, put_*) are covered by the
mock test suite. Before adding live destructive tests, use temporary folders or
dummy uploads that are safe to clean up.
Injected or mock-backed clients should use in-memory tokens or an explicit test config path; they must not fall back to the default rmapi config location.
Metadata
Release files for remarkapy 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| remarkapy-0.3.1.tar.gz | 39.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| remarkapy-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 70.9 kB
Release files / remarkapy-0.3.1.tar.gz
| Download URL | remarkapy-0.3.1.tar.gz |
|---|---|
| Size | 39.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
969499ec98a601daab3368e098983dae955e4b5330e18a6de78803b56c9cfcd0
|
|
BLAKE2b-256 checksum How to use checksums |
a43318c76daa284e57f427e680d7eb0a474053bb1471befac0e61991c05b4051
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / remarkapy-0.3.1-py3-none-any.whl
| Download URL | remarkapy-0.3.1-py3-none-any.whl |
|---|---|
| Size | 31.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e23febc75286c179131bbc8c0ae546033198ab42bef32f409b829a676436e92
|
|
BLAKE2b-256 checksum How to use checksums |
6c493569c9ac30643968686a51b44514d538079d8f32af15b3016c085e7119c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency log