Write by hand. Send it to the web.

Writing
Hand

Write on reMarkable, edit its transcription if you want to, then send. Writing Hand cleans up the email and turns your words — and, when you choose them, the original handwritten pages — into a Micro.blog post.

From paper to web at the push of a pen.

Set up Writing Hand ↓
01

Write

Use the reMarkable exactly as you normally would. Handwriting remains the source.

02

Send

Use reMarkable’s Send by email. Include transcription, original PNG pages, or both.

03

Publish

Writing Hand removes the transport clutter and creates a Micro.blog draft — or publishes only when you explicitly ask.

How it works

Your handwriting goes first.

The native-feeling reMarkable route is deliberately simple: write by hand, optionally edit reMarkable's transcription, send the page, and let Writing Hand do the mechanical bit.

reMarkable ↓ Send by email private Writing Hand address ↓ Resend email.received webhook Writing Hand Netlify Function ↓ cleaned transcription and/or ordered PNG pages Micro.blog ↓ private draft by default, or published when explicitly requested
Safe default: email is always a draft unless the transcription explicitly contains Status: published in the leading metadata block.

What reMarkable can send

For text posts, the reMarkable notebook/document name is transport metadata, not a Micro.blog title. Text posts stay untitled unless you add Title:. Image-only sends keep the filename/notebook-name fallback.

Handwritten metadata

Put metadata at the very start of the transcription. These lines are stripped from the final post:

Title: A proper long-post title
Categories: reMarkable, micropost
Status: published

This is the actual post text.

Title: is optional. Categories: is comma-separated and only matches categories that already exist on that Micro.blog destination. Status: accepts exactly draft or published, case-insensitively.

If Status: is missing, the post is a draft. Unknown or misspelled values stay in the body and force draft behaviour. A typo must never accidentally publish.

You can also use a leading hashtag-only line as category shorthand:

#reMarkable #micropost

How cool is that?!

Ordinary hashtags later in the post remain ordinary post text. reMarkable's own notebook/page tags are not transmitted by Send by email, so they cannot currently map automatically to Micro.blog categories.

Why PNG?

For original handwritten pages, choose PNG. The email path currently supports PNG pages directly; PDF email attachments are not yet supported. Browser PDF import is separate and still works in Publish Hand.

Technical setup

Wire up your own Writing Hand.

This is a personal publishing bridge, not an account service. Your private receiving address, Micro.blog token and Resend configuration live in your own deployment.

1. Enable Resend inbound

Enable inbound email in Resend. The simplest form is an address on a Resend-managed inbound domain:

<anything>@<id>.resend.app

Choose a private, high-entropy local part, for example:

blog-f7c2a91d@<id>.resend.app
Treat the address like a password. Anyone who knows a configured posting address can create a post and can request live publication if they know the Status: published syntax.

2. Create a dedicated Micro.blog token

Create a separate Micro.blog app token specifically for unattended email publishing. Add it to Netlify as:

MICROBLOG_EMAIL_TOKEN

3. Add the Resend API key

Create a Resend API key that can read received email bodies and attachments, then add it to Netlify as:

RESEND_API_KEY

4. Configure recipient routes

Recommended: set POST_BY_EMAIL_ROUTES to a JSON object mapping each exact private receiving address to the Micro.blog Micropub destination UID/blog URL:

{
  "blog-f7c2a91d@abc123.resend.app": "https://example.micro.blog/"
}

For several blogs:

{
  "personal-f7c2a91d@abc123.resend.app": "https://personal.example/",
  "project-82d4b610@abc123.resend.app": "https://project.example/"
}

POST_BY_EMAIL_ROUTES is authoritative when present and fails closed if malformed. Older single-destination installs can instead use POST_BY_EMAIL_ADDRESS plus MICROBLOG_EMAIL_DESTINATION.

5. Create the Resend webhook

Create a Resend webhook for the email.received event using:

https://YOUR-SITE.example/api/post-by-email

Copy the webhook signing secret into Netlify as:

RESEND_WEBHOOK_SECRET

Then redeploy so the function receives the final configuration.

Environment variables

VariablePurpose
RESEND_API_KEYFetch received email content and attachment URLs.
RESEND_WEBHOOK_SECRETVerify signed Resend webhooks.
MICROBLOG_EMAIL_TOKENDedicated Micro.blog token for unattended publishing.
POST_BY_EMAIL_ROUTESRecommended JSON map of private receiving addresses to Micro.blog destinations.
POST_BY_EMAIL_ADDRESSLegacy single-route receiving address.
MICROBLOG_EMAIL_DESTINATIONLegacy single-route Micro.blog destination.

Test sequence

  1. Save the private inbound address as a reMarkable recipient.
  2. Send a tiny transcription or PNG page with no Status: field.
  3. Confirm a private Micro.blog draft appears.
  4. Try title/categories metadata.
  5. Only then test Status: published with a disposable post.

Troubleshooting

503 Post by email is not configured

Check RESEND_API_KEY, RESEND_WEBHOOK_SECRET, MICROBLOG_EMAIL_TOKEN and the route configuration.

Webhook accepted but no post appears

Check that the exact recipient in Resend matches a key in POST_BY_EMAIL_ROUTES, and that the destination value is the correct Micropub destination UID.

Status: published appears in the post

The value must be exactly published and must be in the leading metadata block. Unknown values deliberately remain body text and stay draft.

Transcription works but pages do not

Send original pages as PNG. PDF email attachments are not yet supported.

Categories are missing

The category must already exist on the selected Micro.blog destination. Matching is case-insensitive; unknown categories are ignored.

Resend retries a webhook

That is safe. The email ID is recorded in Netlify Database and stale/interrupted jobs are reconciled before a replacement post is created.