(Nil) => {To.Dev;}

Apps

  1. July 2026 - August 2026

  2. May 2026 - June 2026

DotEmber

Visit .Ember

Your whole day in one window. Journal, todos, calendar, timer, news and reports.

Beta
  • macOS

.Ember (DotEmber) puts the whole day in one Mac app. Write the journal, plan the day beside it, and start the timer without leaving the window. Everything is saved as Markdown files in a folder you choose.

The page below is about the design decisions and why they were made.

Why .Ember

Journal
Journal

.Ember started as an app for my own use. I had a separate app for each part of the day, and the switching itself was the cost: I would open three of them in the morning and have no interest left for the fourth.

I didn’t need a more sophisticated single app. I needed one that fit my day, and my own way of working through it.

Local-first

Sync settings
Sync settings

The first decision was that nothing lives anywhere but your own disk. Everything .Ember writes is a Markdown file in a folder you pick. There is no account to make and nothing to sign into, and if the app disappears tomorrow the folder still opens in any editor.

The Markdown files are always the source of truth. The SQLite search index lives outside the vault, in the app’s own container, and is a cache the app can rebuild at any time.

iCloud sync is optional and runs through your own iCloud account. There is no server of mine in between, and what syncs stays inside that account too. RSS feeds come straight from the publishers, and AI features use your own API key and are off by default.

If you keep notes in another Markdown app. You can open the .Ember vault in that app directly: the entries are plain Markdown files, and the hidden folder the other app writes is one .Ember skips. To keep a folder you already use as it is, there is an optional Markdown folder sync, and the two folders have to be in different places. The engine mirrors Markdown between them on a schedule you set, previews the first run before changing anything, and preserves the losing side of any conflict. The other direction - pointing .Ember at a folder another app already manages - is not supported. See Can I use it with other Markdown editors?.

ADHD in mind

Start your day
Start your day

Because of my own ADHD tendencies, what I needed most was focus with as little friction as possible. So there is one core feature, Start your day, and everything else exists to support it. It is off by default. Once turned on, the first thing that opens each day is a full-screen journal and todo wizard. No sidebar, no tabs, no decision about which view to be in: write first, then list what today is for.

Blocks group todos by context: Urgent, Routine, Project and Admin to start, plus whatever you make, and a whole block runs straight into the timer. Repeating todos come back each morning, and .Ember still knows the difference between a renewed habit and something you typed in yourself. The command palette (⌘K) is one keystroke from anywhere.

Design

Todo Calendar
Todo Calendar

One screen, and the same blocks everywhere else. The left pane holds the todo lists, the right pane is the week or month, and scheduling is dragging a todo onto a day. There is no separate planner view to keep in sync.

Timer and the menu bar
Timer and the menu bar

Those same lists carry over. A block you made here shows up in the timer and the menu bar unchanged, with the same dot, name and “done/total” count, so moving between features never means re-reading the screen. Only the density differs between the Mac and the phone.

A todo's labelled options, open in the list
A todo's labelled options, open in the list

How a todo’s options are laid out. Every field has its own labelled row. It was a single line first, the values trailing the title like a sentence, which read well at a glance and worse every time after that. So the labels came back.

The first shape on the left, the labelled rows that replaced it on the right
The first shape on the left, the labelled rows that replaced it on the right
Light theme
Light theme

Themes and accents. Dark, light or following the system, seven accent presets, and a custom colour if none of them fits. Every preset keeps a separate value per theme, so the accent clears WCAG AA contrast in both, and each device keeps its own choice.

Mood tracker
Mood tracker

Mood tracking. Each journal entry can carry a mood, set in one click as you write it. Reports plots them across the month, so the trend is there later without anything extra to fill in.

Notebooks are folders. A notebook is a directory, nested as deep as you like, and a page is a file named for its subject, so Finder, Spotlight and any Markdown editor show the same tree the sidebar does. Rows drag into the order you want, and a deleted notebook comes back whole.

Markdown that stays out of the way. The marks fade as you write, and with Hide Markdown on they stay hidden until the caret returns to them. Paste keeps the formatting it was copied with (bold, links, lists) on the Mac and the phone alike.

Stack

This is my first Mac app, so the first version was built on the stack I was already used to: Electron, React 19 + TypeScript, Zustand, better-sqlite3, CloudKit JS. It reached 1.0.

Two things made me rewrite it in Swift. Packaging: sandbox-aware code signing, CloudKit JS with no fetchRecordChanges so every sync was a full query, Liquid Glass out of reach from a Chromium renderer, and Swift code re-wrapped as Node modules just to be callable. And the phone: with Electron, iOS means a second codebase; with Swift, it is one more target on the same core.

The rewrite:

  • SwiftUI, with AppKit where the system demands it: the menu bar extra, the calendar grids, the sidebar, drag-and-drop. Markdown editing via CodeMirror 6.
  • SwiftData - an auxiliary cache; the Markdown files are still the source of truth.
  • SQLite + FTS5 - full-text search; the index rebuilds itself if the cache is ever lost.
  • CloudKit (native) - delta sync through the private DB. Vault files ride iCloud Drive; the optional Markdown folder mirror covers any other folder.
  • StoreKit 2 - the 14-day trial and the one-time purchase.
  • EventKit, plus a Google Calendar adapter - multi-account, with Google Tasks.
  • Liquid Glass on macOS 26+, with an NSVisualEffectView fallback down to macOS 15.
  • 19 local Swift Package Manager modules in a tiered graph - a UI-free domain core, enforced at compile time. The iOS app consumes the same packages.

App Store only, sandboxed. And the foundation the iPhone and iPad app sits on, without a second codebase.

DotEmber for iPhone/iPad

Visit .Ember

The Mac's .Ember, on iPhone and iPad. Same files, same purchase, all three devices.

Beta
  • iOS
  • iPadOS

.Ember for iPhone/iPad is the Mac app’s companion. Everything the Mac does, on the same files, plus what only a phone or an iPad can. One purchase covers Mac, iPhone and iPad.

The page below is about the design decisions and why they were made.

Why an iOS version

A journal fills up before you sit down at a desk: most of what I wanted to write down came to me away from it. So I wanted the app on iPhone and iPad too, and the Mac app was rewritten in Swift for that. With a shared core, iOS is one more target instead of a second codebase.

The core (vault, sync, search, calendar, license, AI) is a tiered graph of packages with no UI in it. The iOS app imports it unchanged and adds one layer of its own: a mobile UI. When the core gains a feature or a fix, it lands on both platforms at once.

One vault, every device

The journal on iPad, Settings on iPhone
The journal on iPad, Settings on iPhone

With a second device, sync became indispensable. There is still no .Ember server. The vault lives in iCloud Drive, and iOS decides what stays on disk: a file is fetched when you open it, and the on-device search index keeps working offline.

Structured records go through the same CloudKit private database the Mac app already deployed. The iOS app adopted that schema as-is, with zero new record types. Conflicts are handled the same way: neither side overwrites the other, and a copy of the other version stays in the vault.

Rebuilt for touch

Todo and Calendar tabs
Todo and Calendar tabs

Everything in five tabs. Menu, Journal, Todo, Calendar, Timer run along the bottom. Menu opens the full sidebar as a drawer, where News, Reports and the notebook tree live, folders and all, with AI, Start your day and Settings at its foot. Start your day is unchanged: the same full-screen wizard, one tap away.

Menu drawer
Menu drawer

One view becomes two tabs. On the Mac, Todo and Calendar share one wide view. A phone’s screen is too narrow, so each became a tab of its own: the same files, one at a time.

One bar for new todos. The Todo tab keeps an input bar fixed at the bottom of the screen; it rides up with the keyboard.

Journal
Journal

iPad gets the Mac layout. A full-size window is sidebar, list, editor, like the Mac, except that the sidebar is a drawer that slides all the way out. A narrow Stage Manager window falls back to the iPhone tabs. Hardware keyboard shortcuts (Cmd+1-Cmd+6 for views, Cmd+D for Start your day, Cmd+\ for the sidebar) and Scribble work here too.

Journal pages can be handwritten. Apple Pencil draws inline at the caret, or opens a full-canvas pen entry. Each drawing is saved beside the entry as its own image and linked from the text like any other picture, so it opens on the Mac, and in any Markdown editor. Handwriting is searched like typed text, and the recognition runs only on the device.

Apple Pencil canvas
Apple Pencil canvas

Stack: what’s different on iOS

Timer and Live Activity
Timer and Live Activity
  • SwiftUI, with UIKit bridges where the system needs them.
  • The editor is a native UITextView, not the Mac’s CodeMirror 6: a WebView editor on iOS cannot use dictation, the text magnifier, or Writing Tools, and its first launch is slower. TextKit reproduces the same dimmed-Markdown rendering.
  • Live Activities + Dynamic Island for the running timer; widgets, App Intents, and the Action Button for quick capture, and a todo checks off right on the widget; Handoff to continue an entry, or a running timer, on the Mac.
  • PencilKit on iPad, with Vision reading the ink into the local search index. The saved image is the editable .pkdrawing beside a rendered .png, an ordinary attachment pair, so ink syncs with the vault and needs no schema change. The Mac re-renders the same ink for dark mode.
  • StoreKit 2, as a Universal Purchase: one one-time unlock covers Mac, iPhone, and iPad, Family Sharing included.