A planner for your Supernote. Every calendar, not just one.
Tasks, calendars, dated notes and handwriting capture — on the device, in one place.
Subscribe to Google, Outlook and Apple calendars, or connect the Supernote's own To-Do app,
with no server at all.
➜ Task Hub — the self-hosted server
One command to install, runs on a Raspberry Pi. Recommended for tasks and calendars, not required for notes.
📖 Full documentation · Getting started · Every setting · Connecting tasks & calendars · Troubleshooting
| Tasks | Any CalDAV server, with priorities, repeats, sub tasks and due dates. Grouped Overdue / Today / Next 7 days / Later / No date |
| Calendars | Year, quarter, month, week and day views over as many calendars as you watch |
| Google, Outlook & Apple calendars | Subscribe to the .ics address they publish — no account and no server. Read-only; see why |
| The calendar on paper | Insert snapshot puts the day, week, month or quarter into a note as a page to handwrite over |
| The Supernote's own To-Do app | Optional two-way connection through Supernote Cloud, off until you switch it on. Includes the Inbox — to-dos filed in no list at all |
| Handwriting → task or event | Lasso writing on a page and it becomes either, with a link back to the page |
| Notes for every scale | Daily, weekly, monthly, quarterly, yearly and meeting notes, each with its own folder, layout and template |
| Find | Search the keywords and starred pages across all of those notes |
| No server needed | Every note feature, the calendar views, templates, page marks and Find work with nothing configured |
📖 Full documentation — every setting, every view, every feature.
Ratta's own calendar subscribes to exactly one calendar. A work calendar, a family one and a couple of shared ones mean choosing which single one the tablet gets to show. Its planner has no year view, no quarter view, and no way to attach a note to a week, a month or a meeting. Its to-do list has no sub tasks and no priority.
This plugin is a planner that does those things, on the device, on the page you are already writing on.
| Built-in | Task Hub plugin | |
|---|---|---|
| Calendars shown at once | 1 | as many as you watch |
| Views | month, agenda | year, quarter, month, week, day |
| Create and edit events on device | ✓ | ✓ including repeat rules |
| Notes tied to a date | daily | day, week, month, quarter, year — each with its own folder and template |
| Notes for a future date | — | ✓ any date, pinned to that day |
| Notes attached to an event | — | ✓ one note per meeting, shared across a repeating series |
| Jump from a task to the page you wrote it on | — | ✓ |
| Sub tasks | — | ✓ nested, folded, ordered by soonest step |
| Task priority | — | ✓ high / medium / low |
| Repeating tasks | — | ✓ |
| Handwriting → task | — | ✓ |
Year, quarter, month, week and day. The year is twelve grids with tappable quarter and month headings; the quarter is three; the month has a week-number gutter that opens or creates that week's note. Days carrying an event, an open task or a note are marked, so the shape of a month is visible before you touch anything.
The week is a horizontal strip of seven days, like one row of the month grid, with the week's schedule and to-dos in two columns beneath it. Days already past are greyed but stay selectable — last Tuesday is exactly where you go to write up what happened. Picking a day in the strip brings that day's entries forward and drops the other six back to grey.
In the month and week grids, the first tap selects a day and the second opens it. "Go to today" is one press from any view, and switching views lands on today rather than wherever the last view happened to be pointing.
Repeating events appear on every day they fall on. FREQ, INTERVAL, COUNT, UNTIL
and BYDAY are expanded over the fetched window, and EXDATE is honoured so an occurrence
you cancelled stays cancelled. Editing one occurrence edits the series, and the form says so
— the date it shows is when the series starts, not the day you tapped to get there.
Tick as many CalDAV collections as you like and they appear in one calendar, each event badged with the collection it came from. Create an event on the device, choose which calendar it goes into, set a repeat rule, and it is written straight to the server.
The day view's hours are yours to set. A nine-to-five agenda gets nine-to-five rows, at a readable size, instead of twenty-four cramped ones. Nothing is hidden by narrowing it: all-day items stay at the top, anything earlier sits just under them, anything later goes below the last hour — each with its time and its calendar.
Neither Google nor Microsoft can be reached by any CalDAV client any more. Google
withdrew password access to CalDAV in March 2025; Microsoft retired it for Outlook.com and
365 outright. Both still publish a private .ics address for each calendar, and so do
Apple, Fastmail and Proton — so Task Hub subscribes to those.
Paste an address, or drop a plain text file of them on the device and import the lot in one tap. A private calendar address is about a hundred characters of random text, and typing one on a tablet is nobody's idea of a good evening.
These are read-only, and slower to load, and both are properties of the format rather than things that can be fixed. A published file has no address to write a change back to, and it holds every event the calendar has ever had with no way to ask for less. Task Hub does what can be done — conditional fetching, caching the parsed result rather than the file so an unchanged calendar is never re-parsed, parsing in pieces so the panel keeps drawing, and keeping only the months in view — and a subscribed event can still have a note attached, because that link lives on your device. For calendars you can edit, use CalDAV or the server.
Optional, off until you switch it on: a two-way connection to the to-do list built into the tablet, through Supernote Cloud. Its lists appear beside your others and can be ticked, edited and added to from here. Open to-dos only — completed ones stay on the tablet.
To-dos that belong to no list — the ones in the To-Do app's All view and nowhere else — come over as a list called Inbox, the name the tablet uses. It appears only while something is in it, and it is read-only, because a to-do that belongs to no list has nowhere in it to be added.
It is the one thing in the plugin built on an API Ratta never published — worked out against a live account, and it works, but nothing about it is promised. Supernote's session lasts thirty days and cannot be renewed, so it wants signing in again each month; the plugin shows how long is left and warns a week ahead. Your password is never stored — only the session it is exchanged for, and it is hashed before it leaves the device.
If you run the server, you do not want this: it already syncs the same to-dos, both ways, and keeps working when this cannot.
A note for a day, a week, a month, a quarter or a year. Each kind has its own folder, its
own filename layout ({YYYY}/{MM}-{MMMM}/{DATE}, {YYYY}/W{WW}, {YYYY}/{QQ}), its own
template, and its own on/off switch.
Every button says Open or Create depending on whether that note already exists, and that works for any date, forward or back. Plan next Tuesday from the month grid this week: tap the day, create its note, write the plan. It is pinned to that date, the grid marks it, and when Tuesday arrives the day view opens the same file.
Every day inside a period resolves to the same path, so Tuesday and Thursday cannot end up with two different "weekly" notes. Weeks start on Sunday, matching the week view the button is pressed from.
One folder for everything, if you want it: one button sets all six note types to a single dated tree, so a year's folder holds that year's note, its quarters, its months, and each month holds its own note beside the days inside it.
Note/Journal/2026/Year.note
Note/Journal/2026/Q3/Quarter.note
Note/Journal/2026/September/Month.note
Note/Journal/2026/September/Week 38.note
Note/Journal/2026/September/14/Daily.note
Notes you already have are never moved. The layouts are offered as presets too, so you can take one and leave the rest.
The date at the top of a new daily note, optionally — written into a text box in the format you chose, when the note is created and never when an existing one is opened, so it cannot write into a page twice. Leave it off if your template already prints the date.
Templates come from the device's built-in set, your own MyStyle folder, or any PNG or
JPG anywhere on the device — three tabs, real thumbnails, and a search box. The template is
applied when the note is created; changing it later does not restyle notes you already have.
Open an event in any view and it has its own note — Open if it already exists, Create if it does not. Your notes live where you look for the meeting, not in a folder you have to go hunting through afterwards.
Notes are linked to the event's UID, which is what makes a repeating meeting work properly: every occurrence of a recurring event resolves to the same note. A weekly stand-up gets one running note that builds up week after week — open next Thursday's occurrence and last Thursday's notes are already there. A one-off event carries its date in the filename instead, so two unrelated meetings that share a title stay tellable apart.
Notes are named after the meeting itself — Team sync.note — because the link is kept in a
uid → filename map rather than smuggled into the filename as a hash. The folder stays
readable when you browse it on the device. Meeting notes get their own root folder and their
own template, and the link is stored only on the device — nothing is written back to
CalDAV, so the plugin never modifies anyone else's event.
Every watched list in one place, cut into Overdue, Today, Next 7 days, Later and No date, with a count on each heading — so "what is late" is answered by looking rather than by reading dates down the page. Search, sort, tick off, edit anything.
Ticking an ordinary task completes it there and then. Only a task captured from handwriting asks first, because completing that one also edits your own note by removing the box from the page it came from.
A task and its steps stay together: a step due next week under a parent that is already overdue is filed with its parent, because the two are one piece of work.
Sub tasks. A task with steps shows a fold arrow and a count, folded by default, with each
family placed by its soonest outstanding step — so a piece of work due this morning sits
with everything else due this morning, not at the bottom because the parent itself has no
date. Add them one per line when writing a task; they inherit its due date, and a line ending
@2026-09-10 dates that step on its own.
Priority — high, medium, low — read across the whole RFC 5545 range and shown as a badge.
A task another client stored as PRIORITY:3 stays a 3 when you edit its title here.
Repeats — daily, weekly, monthly, yearly. A rule this menu cannot name (every second
Tuesday, anything with COUNT or UNTIL) reads as custom and is left byte-identical.
Edits are surgical text changes to the calendar object rather than a reserialisation, so
RRULE, ATTENDEE and X- properties this plugin does not model survive untouched.
Completion is a conditional PUT with If-Match on the ETag: a task changed elsewhere since
the list loaded fails with a clear message instead of silently clobbering the other change.
Lasso a handwritten line on a NOTE page, tap Task Hub, and the on-device recogniser fills in the title — editable before saving, which is where you fix a misread. Set a due date, priority, repeat and sub tasks, pick which lists to file it into, save.
The page keeps a mark so the writing shows it became a task: a box around the strokes (dashed, solid, underline or off), optionally the caption "Task Hub", optionally a marker-pen wash in a colour you choose. Completing the task removes the mark again. Every part is off-switchable, because it writes into your own note.
A third tab that lists every keyword and every starred page across your daily, weekly, monthly, quarterly, yearly and meeting notes. Tap a result and the note opens at that page.
It is not handwriting recognition and it does not guess: a keyword is text you added on the device, so a match is exact. Turn on previews and starred pages are drawn as thumbnails, cropped to the top of the page where the writing usually is, so you can flip through them by eye. It is indexed by modification time, so a second visit reads only the notes that changed.
A task captured from handwriting remembers which note and which page it was written on,
and every place it appears carries a ↩ page chip — the task list, the day view and the
week view. One tap closes the plugin and opens that note at that exact page, so the
context behind a one-line task is never more than a tap away. Coming back lands you where you
were, because leaving is bookmarked.
The path and page number ride along on the task itself as X-TASKHUB-SOURCE and
X-TASKHUB-SOURCE-PAGE, so the link survives a sync and is still there on the next device
that reads the list.
The reverse trip is the one thing that cannot work. Tapping the box on the page shows the Task Hub logo — the SDK's link types are pages, files, documents, images and URLs, none of which can reach a plugin, and the image says so rather than leaving you wondering.
The last lists fetched are kept on the device, so a cold open draws real content immediately rather than an empty list behind a spinner; the fetch then replaces it in the background.
Events are requested for a window — three months back, twelve forward — rather than every
VEVENT ever written. Paging outside it fetches the missing stretch and merges it, so going
back through the years costs one small fetch per new stretch instead of re-downloading
everything. Only open tasks are fetched at all. Parsing yields to the interface every few
objects, so taps still land while a large collection is being read.
Every screen has been rebuilt around the fact that this is e-ink, not a phone.
Forms fit one panel. The capture screen and both editors used to be two panels tall with Save at the bottom, so a two-second lasso led to a screen you had to scroll before you could finish. Now the essentials are on the first page, everything else sits behind More… which swaps the body rather than lengthening it, and the actions are pinned at the foot where Save is always reachable.
Pick a value, don't step to it. The time picker offers hours and minutes to choose from, with AM/PM as a pair of chips. It used to be four arrows around a readout — about a dozen taps to reach 3:45pm, each one a full-panel repaint.
Tap a task to open it, tap its box to complete it, consistently across the task list and all three calendar views. Templates are chosen from a grid of thumbnails rather than a list of filenames. Rounded corners throughout, a hairline month grid with the days either side filled in, the selected day as a filled pill, and C / T / N as small filled discs.
No animations, no spinners, no translucent overlays, no second Android window for a dialog — each of those is a full-panel repaint on a screen that cannot afford one. Views and rows are memoised so a repaint happens when something changed and not otherwise. Reloads fetch only what a write invalidated.
It sizes itself to the panel: a Manta runs at full size, a Nomad at 70%, type and spacing together, calibrated against both devices. Settings → This device shows what it detected.
Settings save with nothing configured. The calendar views, all six kinds of note, templates, page marks and the Find tab need no network at all. Tasks and calendar events need somewhere to put them — and even that no longer means running a server, since a calendar can be subscribed to and the Supernote's own To-Do app can be connected directly.
Task Hub reads the X-TASKHUB-ORIGIN property and badges each item with the service it
originally came from — Google, Todoist, TickTick, Obsidian and others — so a list pulled
together from several places still tells you where each item started. Anything this plugin
creates is stamped supernote.
That property is set by a sync service bridging your CalDAV server to those other services; without one, everything reads as third party and the plugin works exactly the same. The plugin talks only to the server address you configure, and to nothing else.
Task Hub is the server this plugin is built
alongside: self-hosted, one command to install, runs happily on a Raspberry Pi. It is what
sets X-TASKHUB-ORIGIN, bridges Google / Todoist / TickTick / Obsidian / Apple / Microsoft
into one place, syncs the Supernote's own built-in To-Do app both ways, and gives you a web
view of the same tasks and calendars this plugin shows.
You do not need it. Any CalDAV server works — Radicale on its own is enough — and the note features need no server at all. But if you want the tasks on your Supernote to be the same tasks as everywhere else, that is what does it.
Grab TaskHub.snplg from Releases, copy it to MyStyle/ on the device,
then Settings → Apps → Plugins → Add Plugin.
Use Add Plugin rather than reinstalling an existing entry: reinstall reads the host's own
managed copy under MyStyle/Plugins/, not the file you just copied across, so a new build
appears to do nothing.
Then open the plugin's settings, enter your server address and login, tap Discover, and
tick the task lists and calendars to watch. Discovery follows the CalDAV standard
(RFC 6764 — /.well-known/caldav, then the principal's calendar home), so it works against
Radicale, Nextcloud, Baikal, Fastmail and anything else that speaks the protocol. If your
server keeps a collection somewhere discovery does not reach, paste its full URL into the
manual field instead.
Need a server? Task Hub installs with one command and runs on a Raspberry Pi. Or point this at any CalDAV server you already have. Or skip it entirely — the note and calendar-view features work without one, and settings save with nothing ticked.
npx tsc --noEmit # must pass first — Metro does not typecheck
npx eslint . --ext .ts,.tsx,.js
npx jest # 338 tests
./buildPlugin.sh # -> build/outputs/TaskHub.snplg
# Windows: .\buildPlugin.ps1buildPlugin.sh exits non-zero and packages nothing if the APK step fails. That matters:
build/generated is never cleared, so an earlier build's app.npk is sitting there, and a
script that carried on would zip a new JS bundle around a stale native payload and report
success.
Needs the Android SDK with NDK 27.0.12077973, a JDK and Node on PATH. HANDOFF.md carries the full setup, the architecture, and the bugs worth not rediscovering.
This repository is named for what it is; the code inside is named TaskHub, one word. That
is deliberate and load-bearing — do not "tidy" it to match the repo.
app.json's name and PluginConfig.json's pluginKey must stay identical. A mismatch
installs cleanly and then does nothing at all: no buttons, no settings, no error. pluginID
must never change once distributed — it is what identifies the plugin to the device.
package.json's name sets the .snplg and .bundle filenames.
react-native is pinned to 0.79.2 by the on-device PluginHost runtime, not by convention.
react, react-test-renderer and @types/react must all stay at exactly 19.0.0: npm's
^19.0.0 peer range will happily install 19.2.x, which fails silently on-device with
Incompatible React versions before the first render. Nothing shows up in npm test.
INTERNET for your CalDAV server, and FILE:READ / FILE:WRITE for daily notes, meeting
notes, and the settings file. Settings are stored as JSON in Document/TaskHub/settings.json
— outside the plugin's private directory, so they survive updates and reinstalls.
That file is plain text on shared storage, password included; a plugin has no access to a keystore. Prefer a CalDAV credential scoped to the collections you use over an account password. Settings → Wipe All Save Data clears it, since uninstalling does not.
Task Hub is free software under the GNU General Public License, version 3. The full text is in LICENSE.
In plain terms: you may run it, study it, change it, and pass it on. If you distribute it, or anything built from it, you must do so under the same licence and make your source available. A modified Task Hub cannot be shipped inside a closed product.
The same licence as the server, deliberately — the two are built alongside each other and there is no reason for the terms to differ.
The dependencies are permissive and impose no conflicting requirement: React Native and
Ratta's sn-plugin-lib SDK are both MIT.
Copyright © 2026 Sparkinman.
- Handwriting inside plugin views is impossible on this firmware — showing a plugin view gates the EMR pen at the hardware level. Capture via lasso on the page is the supported path; finger touch works normally in the UI.
- Recurrence is expanded by this plugin, not by the server, and only for the rules it can
read:
FREQ,INTERVAL,COUNT,UNTILandBYDAY. Anything else — aBYSETPOS, an ordinalBYDAYon a monthly rule — falls back to showing the event on its start date alone rather than guessing at days it does not fall on. - Editing a repeating event edits the whole series. There is no "this occurrence only": the server holds one object, and the form is explicit that changing the date moves every occurrence.
TZIDis treated as device-local. No timezone database is bundled, so a foreign-zone event can sit an hour out — better than dropping it.- One-way for now: nothing is read back beyond listing. No un-complete, no dedupe, no offline queue.
- The marker-pen wash and the caption are separate elements from the box, so moving the handwriting leaves them behind — the SDK gives no way to group them. Only the box travels with the strokes.
- The wash covers the lasso selection, which is very slightly inside the box the host draws around it. The host does not report where that border goes and the SDK offers no way to ask, so it cannot be made to line up exactly. Shading is off by default.
- A link on the page cannot open the plugin. The SDK's link types are note page, note file,
document, image and URL, so the box points at an image that says so. Going the other way —
from a task to its page — works, via the
↩ pagechip.