| name | remarkable |
| description | Send documents to reMarkable tablet and fetch annotated versions back. Supports full review workflow - send PDF, annotate on tablet, fetch back with your handwritten notes. |
| allowed-tools | Read, Bash(~/.local/bin/rmapi *), Bash(python3.11 *) |
reMarkable Integration
Send documents to your reMarkable tablet and retrieve annotated versions.
Command: $ARGUMENTS
Supported Commands
Parse the arguments to determine which action to take:
send <filepath> [folder] or just a filepath
Upload a PDF or EPUB to reMarkable.
~/.local/bin/rmapi put "<filepath>" "<folder>"
- If no folder specified, uploads to root (/)
- Folder must exist - create with
mkdir first if needed
Examples:
/remarkable send /path/to/doc.pdf → uploads to root
/remarkable send /path/to/doc.pdf /Work/Reports → uploads to specific folder
/remarkable /path/to/doc.pdf → shorthand, uploads to root
fetch <document-name> [output-dir]
Download a document and render annotations (pen strokes, highlights) onto the PDF.
IMPORTANT: Do NOT use rmapi geta — it is broken for v6 format. Use the Python renderer instead:
python3.11 -c "
import sys
sys.path.insert(0, '${CLAUDE_SKILL_DIR}')
from src.remarkable_skill.archive import fetch_and_extract
from src.remarkable_skill.renderer import render_annotations, pdf_to_png
from pathlib import Path
output_dir = '<output-dir or /tmp>'
archive = fetch_and_extract('<document-name>', output_dir)
output_pdf = Path(output_dir) / f'{archive.visible_name}-annotated.pdf'
if archive.rm_files:
stats = render_annotations(archive.pdf_path, archive.rm_files, output_pdf)
print(f'Annotated PDF: {output_pdf}')
print(f'Pages: {stats.pages_processed}, Strokes: {stats.strokes_rendered}')
else:
print(f'No annotations found. Original PDF: {archive.pdf_path}')
"
To also generate PNG images (so you can SEE the annotations):
python3.11 -c "
import sys
sys.path.insert(0, '${CLAUDE_SKILL_DIR}')
from src.remarkable_skill.archive import fetch_and_extract
from src.remarkable_skill.renderer import render_annotations, pdf_to_png
from pathlib import Path
output_dir = '<output-dir or /tmp>'
archive = fetch_and_extract('<document-name>', output_dir)
annotated_pdf = Path(output_dir) / 'annotated.pdf'
if archive.rm_files:
stats = render_annotations(archive.pdf_path, archive.rm_files, annotated_pdf)
else:
annotated_pdf = archive.pdf_path
png_paths = pdf_to_png(annotated_pdf, Path(output_dir) / 'png', dpi=200)
for p in png_paths:
print(p)
"
After fetching PNGs: Use the Read tool to view each PNG file — you can see the handwritten annotations directly.
list [folder]
List contents of a folder on reMarkable.
~/.local/bin/rmapi ls "<folder>"
[d] = directory/folder
[f] = file/document
find <name>
Search for a document by name.
~/.local/bin/rmapi find "<name>"
mkdir <path>
Create a new folder.
~/.local/bin/rmapi mkdir "<path>"
status
Check connection status.
~/.local/bin/rmapi ls / 2>&1 | head -5
If this returns content, connection is working.
Full Review Workflow
The typical workflow for document review:
- Create document with Claude → produces
.md
- Export to PDF →
/export-pdf document.md
- Send to reMarkable →
/remarkable send document.pdf
- Annotate on tablet → user marks up the document
- Fetch annotated version →
/remarkable fetch document
- View PNGs with Read tool → Claude sees the handwritten annotations directly
- Continue editing → incorporate feedback into the document
Tips
- Document names on reMarkable don't include
.pdf extension
- Use
list or find to find exact document names before fetching
- The fetch command renders v6 annotations (pen strokes, highlights, markers) onto the PDF
- Create folders first with
mkdir before uploading to them
- For PNG output, use
dpi=200 for good quality; increase for sharper images
Error Handling
If commands fail:
- "not authenticated" → User needs to run
~/.local/bin/rmapi in terminal and follow auth prompts
- "not found" → Document/folder doesn't exist, use
list to check
- "timeout" → Check internet connection
- "No ZIP file found" → Download may have failed, check rmapi auth