Toplin · Notes for Joplin and iCloud
Write in Markdown, read beautifully typeset articles, and keep everything on your own Joplin server or in iCloud. No tracking, no analytics, no third party in the middle.
Marcellus for article titles, Noto Sans for body copy, Fira Sans for the interface. A note reads like an editorial page, not a plain text box.
Editor and preview side by side, with linked scrolling — move one pane and the other follows. Every note switches between Editor, Split and Preview.
Turn any note into a form. Each session is kept as its own dated entry, and every number you mark for charting is plotted over time — a training log that never leaves your notes app.
Task lists, headings, inline images, tables and code blocks — with a formatting guide built into the editor toolbar, behind the ? button.
Read and write on warm, textured stock — lined, beige, plaster or printer — instead of a flat white rectangle. It follows you into dark mode.
Tag chips, folder organisation and a live sidebar filter. Deleted notes go to a rubbish bin you can restore from. Light and dark, both tuned for reading.
Choose where your notes live the first time you open the app. One writer per note, so a library never duplicates itself — and nothing passes through us on the way.
Smaller things you notice on the second day.
Hide the sidebar, the note list and the toolbar. Nothing on screen but your article.
Match highlighting, next and previous navigation, and a running match counter.
Read your notes on Apple Watch, without getting your phone out.
Export a note, or a whole selection, with the same typography you read on screen.
Connect a screen and your note becomes a live, readable page for everyone in the room.
Choose “Continue with Demo Data” during onboarding and explore Toplin with sample notes.
Turn any note into a form you fill in again and again. Toplin keeps every session as a dated entry, so a template becomes a training log with charts — without you ever leaving your notes app.
chart=true plotted over time.Minutes per machine, with pace and heart rate. Every duration is charted.
# Cardio Session
- [ ] Treadmill
Time: %%treadmill_minutes:int(unit=min,label=Minutes,chart=true)%%
Speed: %%treadmill_speed:double(unit=km/h,label=Speed)%%
Incline: %%treadmill_incline:double(unit=%,label=Incline)%%
- [ ] Rowing machine
Time: %%rower_minutes:int(unit=min,label=Minutes,chart=true)%%
Distance: %%rower_metres:int(unit=m,label=Distance)%%
- [ ] Cross trainer
Time: %%cross_minutes:int(unit=min,label=Minutes,chart=true)%%
Resistance: %%cross_resistance:int(label=Level)%%
- [ ] Stationary bike
Time: %%bike_minutes:int(unit=min,label=Minutes,chart=true)%%
Average power: %%bike_watts:int(unit=W,label=Avg watts)%%
Total time: %%total_minutes:int(unit=min,label=Total,chart=true)%%
Average heart rate: %%avg_hr:int(unit=bpm,label=Avg HR,chart=true)%%
Felt easy today? %%felt_easy:bool%%
Notes: %%notes:string(multiline=true,placeholder="Pace, breathing, anything worth remembering")%%
Three working sets per lift. Weights are charted so you can see the progression.
# Chest Day
- [ ] Barbell bench press
Set 1: %%bench_1_weight:double(unit=kg,label=Weight,chart=true)%% x %%bench_1_reps:int(label=Reps)%%
Set 2: %%bench_2_weight:double(unit=kg,label=Weight,chart=true)%% x %%bench_2_reps:int(label=Reps)%%
Set 3: %%bench_3_weight:double(unit=kg,label=Weight,chart=true)%% x %%bench_3_reps:int(label=Reps)%%
- [ ] Incline dumbbell press
Set 1: %%incline_1_weight:double(unit=kg,label=Weight,chart=true)%% x %%incline_1_reps:int(label=Reps)%%
Set 2: %%incline_2_weight:double(unit=kg,label=Weight,chart=true)%% x %%incline_2_reps:int(label=Reps)%%
Set 3: %%incline_3_weight:double(unit=kg,label=Weight,chart=true)%% x %%incline_3_reps:int(label=Reps)%%
- [ ] Cable fly
Set 1: %%fly_1_weight:double(unit=kg,label=Weight,chart=true)%% x %%fly_1_reps:int(label=Reps)%%
Set 2: %%fly_2_weight:double(unit=kg,label=Weight,chart=true)%% x %%fly_2_reps:int(label=Reps)%%
Set 3: %%fly_3_weight:double(unit=kg,label=Weight,chart=true)%% x %%fly_3_reps:int(label=Reps)%%
- [ ] Dips
Reps: %%dips_reps:int(label=Reps,chart=true)%%
Added weight: %%dips_weight:double(unit=kg,label=Added)%%
- [ ] Press-ups to finish
Reps: %%pressup_reps:int(label=Reps,chart=true)%%
Session length: %%session_minutes:int(unit=min,label=Minutes,chart=true)%%
Felt strong today? %%felt_strong:bool%%
Notes: %%notes:string(multiline=true,placeholder="Form cues, niggles, what to try next week")%%
The syntax is %%name:type(options)%%. Types are int, double, string and bool; useful options are label, unit, placeholder, multiline and chart. Charting works on numbers only. Fields written under a - [ ] line are grouped under that exercise. The same reference lives in the app, behind the ? button in the editor toolbar.
Your notes travel between your device and your Joplin server or your iCloud account, and nowhere else. There is no tracking and no analytics of what you write. When you sign in to Joplin, your password is stored securely in the device Keychain.
For Joplin sync, a Joplin server — your own or your provider's. For iCloud sync, an iCloud account signed in on your device.
iOS 26 or later, iPadOS 26 or later, or macOS 26 or later.
Toplin is free. Toplin Pro unlocks PDF export, paper backgrounds and the external display.