Your tools. Your accounts. Your deployment.

Set up
Helping Hand

Helping Hand is designed to work as a personal, self-hosted publishing kit. Fork it, deploy your own copy, connect your own Micro.blog account, and add the optional server-side routes you actually use.

01

Browser tools

Publish Hand and BUM Hand work with your own Micro.blog app token. Markdown Hand can also save private working drafts to a configured GitHub repository.

Set up the shared deployment ↓
02

Writing Hand

Add the reMarkable write → send → Micro.blog path with Resend inbound email and a dedicated server-side token.

Set up Writing Hand →

Self-hosting

Make it yours.

The browser tools are local-first. Micro.blog tokens are supplied when needed and are not persisted by Helping Hand. Writing Hand and private GitHub draft routing are separate opt-in server-side boundaries in your own deployment.

Quick reminder: Publish Hand, BUM Hand and Markdown Hand do not require email configuration. Markdown Hand's private GitHub destination is optional; Micro.blog remains available independently. Writing Hand posts are drafts by default; only an explicit Status: published line publishes immediately.

What you need

For the core browser tools: GitHub, Netlify, and a Micro.blog account if you want to publish or upload there. For Writing Hand: Resend inbound email plus a dedicated Micro.blog token. For an optional private GitHub working-draft destination: a narrowly-scoped repository token stored server-side and a separate browser write key.

1. Fork or clone

git clone https://github.com/davidmarsden/handwritten-publish.git
cd handwritten-publish
npm install
npm test
npm run build

For local development:

npm run dev

The suite uses Vite/React plus static product pages. Production output goes to dist/; server-side bridges live under netlify/functions/ and netlify/edge-functions/.

2. Deploy to Netlify

Create a Netlify project from your GitHub fork/repository.

SettingValue
Build commandnpm run build
Publish directorydist

Netlify recognises the functions and Edge Functions in the repository. The repository also contains a Netlify Database migration used by Writing Hand. If you only use the ordinary browser-to-Micro.blog tools, leave the optional server-side environment variables unset.

3. Connect Micro.blog in the browser

Paste a Micro.blog app token into Publish Hand, BUM Hand or Markdown Hand when you want to publish or upload. The token is kept in browser memory and passed to the Netlify bridge only for the requested API calls; Helping Hand does not persist it in IndexedDB, portable documents or Netlify configuration.

Create Micro.blog app tokens under Account → App tokens / Edit Apps. If you have several Micro.blog-hosted blogs, the browser tools use Micropub destinations to let you select one. Publish Hand and Markdown Hand are draft-first when creating Micro.blog posts.

4. Optional: private GitHub working drafts

Markdown Hand can be extended with a private GitHub working-draft destination so a chosen .md file can be saved unchanged before it is ready for publication. Keep that route deliberately narrow: write only to the intended repository and working-draft path, and update the same filename rather than creating accidental duplicates.

The GitHub credential must never go to the browser. Use a fine-grained token restricted to the intended private repository with only the permissions the route needs, store it server-side in your deployment, and protect browser requests with a separate long random write key.

The included implementation is intentionally project-specific. If you enable or adapt this optional route in your own fork, treat the repository name, credentials and destination path as deployment configuration rather than public site content.

5. Optional: enable Writing Hand

reMarkable ↓ Send by email private Resend address ↓ email.received webhook Netlify Function ↓ Micro.blog draft by default or live post when Status: published is explicit

The detailed configuration is on the Writing Hand page. It includes every environment variable, the Resend webhook URL, routing examples and the handwritten title/category/status syntax.

Security summary