Repository navigation
Releases: utkarsh032/NOTO
Release list
NOTO v1.5.0
Highlights
- Save means Save. Documents open from and save to real files on disk. A document that came from a file is written straight back to it; one that has none asks where, once, and remembers. Save As always asks. Word (
.docx) export is new, PDF export writes a file on desktop, and HTML import keeps its formatting. - Double-click a
.mdor.txtfile and it opens in Noto. The desktop app now registers for Markdown and plain-text files. On Windows it appears under "Open with" rather than taking over from Notepad. A file opened this way becomes a document, and Save writes back to it. - A real application menu on the desktop. File, Edit, Format, Insert, View, Go, Tools, Window and Help, built from the same commands as the command palette, so a menu item and its shortcut always do the same thing. Formatting commands now run from the palette as well.
- Noto Memory, version history, folders and tags are real. Memory keeps what you capture on your device. Documents keep their own history, and you can preview it, compare two versions and restore one. The sidebar has a folder tree you can drag documents into, and tags are edited in the Info tab.
noto://links.noto://memory,noto://quick-noteornoto://workspace/<id>open that screen in the desktop app, and on Android.
Improvements
- Tabs can be pinned, duplicated, moved and reopened after closing, from shortcuts or a right-click menu.
- Search uses a full-text index that updates as you type, and long lists draw as they scroll instead of all at once.
- Crash recovery and the Quick Note draft are kept in the database rather than in browser storage, which could be cleared from under them.
- A slimmer header with one row of tabs. The account moves to the sidebar, and pages can be laid out as a sheet of paper or as text from the left edge.
- A screen that fails to draw shows what went wrong, with a way back, instead of blanking the window.
- Android: share text or a link from another app into Memory, use a Quick Note launcher shortcut, and lock Noto with a fingerprint, face or passcode. The session is kept in the Keystore.
- Buttons for features that aren't ready yet are hidden rather than apologising when pressed.
- Security: a strict Content-Security-Policy on the web app and website, and the desktop checks who is calling every privileged function and refuses database statements that could reach the disk. Rate limits fail closed, and a device can no longer be claimed by another account.
Bug fixes
- Desktop users on 1.4.0 also get the 1.4.1 fixes, which were never published as a desktop release. Sign-in works on the deployed web app, and the Quick Note dock closes when you click away, its Close button works, and it stays where you drag it.
- A keyboard shortcut pressed as the workspace appeared could run a stale action.
- Keeping a Quick Note could wipe text typed while it was saving.
- Templates, imports and duplicated documents could open empty.
- On the desktop, saving a document could delete files attached to it.
- Exported files could be missing the last second of typing.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.5.0-win-x64.exe |
| Installer (ARM64) | Noto-1.5.0-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.5.0-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.5.0-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.5.0-mac-arm64.zip |
| Archive (Intel) | Noto-1.5.0-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.5.0-linux-x64.AppImage |
| Debian package (x64) | Noto-1.5.0-linux-x64.deb |
| RPM package (x64) | Noto-1.5.0-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v1.4.0...v1.5.0
NOTO v1.4.0
Highlights
- Accounts work. Sign in with an email and password and Noto is signed in — a real profile on the Home and Account screens, and this browser listed as a device. Everything before this read a fixture.
- Sign-up, protected by Cloudflare Turnstile. Creating an account now goes through a bot check that is verified server-side, where the secret that makes a token mean anything never reaches a browser.
- Signed out is still the whole application. Nothing here is a gate. Noto opens, writes and searches with no account, and a build with no Supabase credentials behaves exactly as it did before.
- Signing out ends the session. It used to walk you to the sign-in screen and leave the session in storage, so the next reload signed you straight back in. It is an action on the account now — offered from the header menu and from the account screen — and the stored session goes whatever the server answers.
Improvements
- The account screen is a protected route. Signed out, it sends you to sign in and remembers what for, so you land back on it afterwards rather than on Home; a profile, a device list and a security history belonging to nobody are never drawn. Everything else stays open to everyone, because Noto is local-first and the work belongs to the device.
- A session coming back is no longer mistaken for no session. Reloading the account screen used to throw you off it for the moment the session took to restore.
- Noto now notices when a session ends somewhere else — another tab, or a refresh token that ran out — and says so, rather than carrying on as though you were still signed in until the next reload.
- The cloud loads only when it is needed.
@supabase/supabase-jsmoved out of the entry bundle behind a dynamic import, so a visitor who has never signed in no longer downloads 164 kB to be told they are signed out. - Password rules are stated once, in
@noto/config. The sign-up form and the service previously kept their own minimum and disagreed by four characters, which the person signing up discovered on submit. - Validation failures arrive on the field that caused them. The server has always sent per-field detail; nothing was displaying it.
Bug fixes
- Sign-out did nothing but change the screen. Until this, ending a session meant closing the browser and hoping.
- A sign-in whose profile could not be loaded reported success and left you on an account screen with nothing on it. It is reported as the failure it is, and the session survives for the retry.
- Sign-in and sign-up failed from a browser with "Could not reach the server". The Edge Functions' CORS preflight did not name the
apikeyheader that every Supabase call sends. - Edge Functions can now import the workspace packages they were always meant to share. Deno could not resolve the extensionless relative imports the bundler accepted, so no function using
@noto/backendhad ever deployed.
A note on password strength
The Have I Been Pwned lookup, the common-sequence list and the email-substring
rule have been removed from sign-up, and the minimum length is six characters.
A password already present in a public breach corpus is now accepted. Turnstile
and the per-IP rate limit are what guard the endpoint.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.4.0-win-x64.exe |
| Installer (ARM64) | Noto-1.4.0-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.4.0-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.4.0-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.4.0-mac-arm64.zip |
| Archive (Intel) | Noto-1.4.0-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.4.0-linux-x64.AppImage |
| Debian package (x64) | Noto-1.4.0-linux-x64.deb |
| RPM package (x64) | Noto-1.4.0-linux-x64.rpm |
Android
| Package | File |
|---|---|
| APK (64-bit) | Noto-1.4.0-android.apk |
| APK (32-bit) | Noto-1.4.0-android-armeabi-v7a.apk |
| App bundle (Play Store) | Noto-1.4.0-android.aab |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v1.3.0...v1.4.0
NOTO v1.3.0
Noto is a whole application rather than an editor with a sidebar, Android runs
that same application instead of an imitation of it, and Noto now tells you
when there is a newer version rather than leaving you to check.
The application
Noto had one screen, reached by opening it. It now has the seven the product is
made of — Home, Workspace, Documents, Noto Memory, Search, Settings, and
Account & Devices — under one shell with a persistent sidebar and a global
header.
Everything else deliberately stays out of the navigation. Quick Note, Quick
Paste, the command palette, shortcuts, import, export, version history and the
assistant are overlays over whichever screen is open, because a floating note
that took the workspace away from you would not be a quick note. Quick Notes and
Clipboard History are Memory with a type already chosen rather than screens of
their own; three places listing captured items would be three sets of filters to
keep in step.
What is real is real, and what is not says so. Templates, import and export,
Trash with restore and permanent delete, pin, duplicate, archive, and search
across documents and memory all work against local storage. Capture, the
assistant, version history and accounts have no service behind them yet, so they
render fully and say so rather than staging a result — a fabricated answer in a
notes application is a note you might later believe.
Every screen but Home is a chunk of its own, and the editor with it. The entry
bundle drops from 1,012 kB to 376 kB, so opening Noto costs the shell and the
greeting rather than the whole product. Routing is on the hash, because the
desktop application is this same bundle loaded from file://, where there is no
server to answer a deep link.
The workspace
The document and its toolbar are one white card filling the pane, rather than a
formatting bar floating above a second, narrower card. The page is one object
being written in, not chrome and a sheet.
The tab strip is drawn as soon as anything is open, including for a single
document — it is what says which document the pane belongs to. The toolbar keeps
what a writer reaches for while writing and moves the rest behind a More
formatting menu; zoom moves to the status bar beside the word count, being the
same kind of fact.
The panel beside the document is two cards now: a tabbed one holding the
outline, statistics, history and the assistant, and a Document Info card below
it for the facts that stay true whichever tab is open. The outline is a foldable
tree with its own search and depth filter, and it follows the reader down the
page.
Writing
Checklists were the one block type the toolbar named and the schema did not
have, so a Task List template had nowhere to put its boxes. They are there now,
on CmdOrCtrl+Shift+9 like every other formatting action.
Show Characters paints spaces, line breaks and block ends without touching the
document: the dot is painted over a space that is still a space, so selecting,
copying and exporting are unaffected by the setting. The markers are built once
when it is switched on and maintained incrementally, because rebuilding a
decoration for every space in a long document on each keystroke would be felt.
The editor pane has a scroll area of its own and remembers where each document
was left — coming back to a tab three pages down and being dropped at the title
is what makes tabs feel disposable.
Print is one render path: the same DOM the editor renders, with the application
stripped off it by a print stylesheet, so what comes out of the printer cannot
drift from what is on screen. Zoom is dropped for a size in points, a dark theme
prints black on white rather than as a page of toner, links print their address,
and headings, tables and images carry break rules.
Android
The phone runs the same Noto now. Android had its own smaller screens
because Tiptap and ProseMirror need a DOM, and a native React Native editor
could not load @noto/editor at all — so Android trailed every release by
however long it took to port a feature a second time, and 1.2.0 had to ship the
warning that editing a formatted document on the phone flattened it.
The Expo application is a shell around the interface instead. It packages the
@noto/ui build into the APK and serves it over a postMessage bridge to the
native SQLite connection — the same arrangement Electron has always used over
IPC, with a different pipe. Tabs, find and replace, history, formatting, the
seven screens and the workspace are therefore not ported to Android; they are
the same code running there. Documents stay on the device exactly as before.
Two things a WebView genuinely cannot do stay native and are reached across the
bridge: printing, and saving a file, which goes to the Android share sheet
rather than to a downloads folder a WebView has no access to.
Updates
Until now the only way to learn that a release had happened was to visit the
download page. The sidebar carries the version it is, a button when something is
waiting, and the release notes behind that.
Three steps are kept apart, because the platforms answer them differently.
Finding out is a question anyone can ask GitHub, and it is all the web
application can do. Fetching is Electron's alone. Applying is a restart on
desktop and a reload on the web — and neither happens uninvited. The default is
to say a version is ready and let you pick the moment, because an update that
replaces the application under someone mid-sentence has chosen badly on their
behalf.
Two settings own it: checking is on, and can be turned off, since it is the only
thing in Noto that reaches the network without being asked; installing without
asking is off. A build that cannot update itself — a Linux package, an unsigned
macOS build — says which and why, instead of offering a button that would do
nothing.
Upgrading
The desktop installer replaces 1.2.0 in place; Windows may keep the old shortcut
icon in its cache for a few minutes after the upgrade. On Android, install the
new APK over the existing one — the signing key is unchanged, and documents on
the device are untouched. This is the last release that has to be fetched by
hand: 1.3.0 and later can tell you themselves.
Known limitations
The desktop installers are unsigned, so Windows SmartScreen and macOS Gatekeeper
warn on first launch — verify your download against SHA256SUMS.txt. That also
means macOS cannot auto-update: Electron requires a signed build to replace
itself, so macOS reports updating as unsupported and links to the download page.
Windows ARM64 is installer-only. Linux updates through the AppImage or your
package manager, as before.
iOS is not published. Cloud sync is not enabled on any platform. Capture, the
assistant, version history and accounts are interface only.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.3.0-win-x64.exe |
| Installer (ARM64) | Noto-1.3.0-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.3.0-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.3.0-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.3.0-mac-arm64.zip |
| Archive (Intel) | Noto-1.3.0-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.3.0-linux-x64.AppImage |
| Debian package (x64) | Noto-1.3.0-linux-x64.deb |
| RPM package (x64) | Noto-1.3.0-linux-x64.rpm |
Android
| Package | File |
|---|---|
| APK (64-bit) | Noto-1.3.0-android.apk |
| APK (32-bit) | Noto-1.3.0-android-armeabi-v7a.apk |
| App bundle (Play Store) | Noto-1.3.0-android.aab |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v1.2.0...v1.3.0
NOTO v1.2.0
Noto has a face, documents are no longer plain text, and the editor finally
keeps everything you type.
Branding
Noto ships with its own icon on every platform. Until now the desktop
application carried Electron's default atom and Android carried the green robot
placeholder — somebody else's artwork standing in for a product that had none
of its own. There was no launch screen at all; Android improvised one from
whatever the launcher icon happened to be.
One source image now drives all of them. scripts/generate-brand-assets.py
derives the Windows .ico at seven sizes, the macOS .icns up to 1024,
the Linux PNG, the Expo icon and adaptive icon, the launch-screen logo, the
favicons and the Open Graph card. When the artwork changes, that script is the
only thing that runs.
The sidebar carries the wordmark, so the application says what it is without
the window title having to.
Editor
Autosave cleared its pending timer on unmount without ever writing it, so
switching documents inside the debounce window silently dropped the last few
keystrokes. The queue is now flushed on unmount, when the window is hidden,
and on an explicit save. The indicator distinguishes unsaved from saving
rather than calling a document clean while a write is still queued.
Deleting a document had a core implementation and a command definition but no
way to reach either. It is now part of the data contract, implemented by both
data sources on top of the existing soft delete, and offered per row in the
sidebar. The tombstone is what sync will need later.
Keyboard shortcuts were declared in the command registry and bound to nothing.
Keys now resolve through the registry, so a command disabled in the current
context cannot fire, and an unbound accelerator still falls through to the
editor. Matching lives in core as pure functions over a structural event, so
the desktop main process can reuse it for the application menu.
Formatting
Documents are no longer plain text. Headings, bold, italic, underline,
strikethrough, bullet and numbered lists, blockquotes, inline and block code,
links, images, tables, horizontal rules and text alignment are all there, from
a toolbar above the document. Everything but images, tables and the divider —
which need a URL or a size first — also has a keyboard shortcut.
Every toolbar control names a command in the registry rather than describing
one of its own, so the label and the shortcut on a button are the ones the
command palette shows. The registry is the editor's keymap now rather than a
description of one: an accelerator is rewritten into the form ProseMirror
expects and those bindings load last, so changing CmdOrCtrl+Shift+7 in
@noto/core changes the key that makes a numbered list. Formatting is bound
there and nowhere else — binding it in the window listener as well would toggle
a mark on and straight back off.
Link is CmdOrCtrl+Shift+K, not the more usual CmdOrCtrl+K, which the
command palette already owns: the palette is reachable from every screen and
formatting is not, so the palette keeps the shorter key.
Link and image addresses go through a scheme allowlist. A note is user data
that renders as HTML and will travel to other devices once sync lands, so a
javascript: href would be stored cross-site scripting rather than a bad link.
Typing a bare host is the common case, so a value with no scheme gets
https://; an explicit scheme is accepted or rejected, never rewritten.
Images are referenced by address or kept as a pasted data: URI. Noto has no
asset store until image capture, and copying binaries into the document — and
into every sync payload — is not something to do behind your back.
This is web and desktop. Tiptap needs a DOM, so the mobile editor stays plain
text, writing the same document model the other platforms read — which means it
can read a formatted document but not preserve one. See the limitation below
before editing on the phone.
Tabs and files
Several documents can be open at once. Which one was showing used to be a
private detail of each platform's data source, derived by falling back to the
newest row whenever nothing was selected — which made Close All impossible,
because closing the last tab reopened something immediately. A tab store in
@noto/core owns that choice now and the data sources follow it, so
activeDocument: null means nothing is open rather than "show me the newest
one".
Tabs hold ids, never documents, so a tab whose document was deleted resolves to
nothing and is pruned once the list is known. They persist per platform the way
settings already do — hydrated at startup, written back on change — so
reopening Noto restores the desk rather than an arbitrary document. The bar
draws nothing for a single document: one tab is a label, not a choice.
Around that, the rest of file handling. Rename happens in the sidebar row
itself and commits on blur as well as on Enter, because the field appears under
the pointer and losing a rename to a stray click would be its own small
betrayal. Recent is what "open" means in an application with no file dialog.
Save All asks every mounted editor to flush; only the front one is mounted
today, but it is the editors that hold unwritten work, not the shell.
Recovery is new. Autosave already survives every ordinary way an edit escapes,
because it flushes on all of them; what it cannot survive is the process
disappearing between a keystroke and the debounced write. A snapshot written
synchronously to local storage on every edit closes that window, and is offered
back — as a choice, not applied — when it outlives what reached storage.
Find, undo and the view
Undo and redo run on ProseMirror's own history and are bound inside the editor
rather than on the window, so undo means the document when the caret is in it.
Find and replace is ProseMirror's search plugin, which is the part worth not
reimplementing: highlights stay correct as the document changes underneath
them. The layer above counts matches for the tally, and the tally says "3
matches" until something is stepped to, rather than claiming the caret is on
the first one.
Word wrap reaches the only blocks that can outgrow the measure. Zoom scales the
type rather than transforming the element, because a transform blurs text and
leaves the caret measuring an unscaled box; it steps along a fixed ladder, so
zooming in and back out lands exactly where it started.
Commands now carry a scope. Formatting and undo are bound inside ProseMirror,
find and the view controls on the window. That was a category heuristic before
and is stated outright now, because getting it wrong binds one key twice and a
toggle turns itself off again.
Four faults were found and fixed on the way, each with a test that fails
without it: the web data source reported an empty list before the workspace
opened, so every restored tab was pruned on reload — "no workspace yet" is not
"no documents"; pruning returned early on the tab count alone, so a document
closed and then deleted stayed in recents for good; renaming from the sidebar
never reached the open editor, whose title lives in local state so that typing
need not wait for a write; and replace did nothing on its first press, because
ProseMirror only replaces a match that is already selected.
Mobile
Every screen shares one store, and now actually does. Each screen used to call
the store hook directly, which gave each of them its own copy of the document
list — a title typed in the editor was written to SQLite while the list carried
on showing the row it had loaded at mount. One provider at the root now holds
the copy both screens read.
Autosave has the same flush-on-unmount fix as the desktop editor: leaving a
document within 600ms of the last keystroke used to clear the pending timer
without ever writing it.
Documents can be deleted, from a button on each row of the list, from the
editor header, or by long-pressing a row. Deleting drops the queued autosave
first — flushing it afterwards would write a fresh updatedAt over the
tombstone and bring the document back.
There is a launch screen, where before there was none: the Noto mark on a flat
backdrop that follows the system appearance.
Upgrading
The desktop installer replaces 1.1.6 in place; Windows may keep the old
shortcut icon in its cache for a few minutes after the upgrade. On Android,
install the new APK over the existing one — the signing key is unchanged, and
documents on the device are untouched.
Known limitations
Editing a formatted document on Android flattens it. The mobile editor
reads a document as plain text and writes it back the same way, so opening one
that has headings, tables, images or links and typing a single character
replaces all of it with unformatted paragraphs. That has been true since the
phone got an editor, but it costs a great deal more now that documents can hold
tables and pictures. Until the mobile editor understands the document model,
edit formatted documents on web or desktop, where nothing is lost.
Unchanged: the desktop installers are unsigned, so Windows SmartScreen and
macOS Gatekeeper warn on first launch — verify your download against
SHA256SUMS.txt. macOS auto-update needs a signed build, and Windows ARM64 is
installer-only. iOS is not published. Cloud sync is not enabled on any
platform.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.2.0-win-x64.exe |
| Installer (ARM64) | Noto-1.2.0-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.2.0-mac-arm64.dmg |
| Disk image (Intel) | [Noto-1.2.0-mac-x64.dmg](https://github.com/utkarsh032/NOTO/releases/downlo... |
NOTO v1.1.6
Noto for Android, published on the download page.
Android
The download page now offers an Android build for phones running Android 7.0
or later. The recommended download is the 64-bit APK, which every phone made
since roughly 2016 wants; a 32-bit build is published alongside it for older
hardware.
It is a 16 MB download. The generated Android project would have made it 104
MB for an application whose JavaScript is 2.2 MB: one APK carrying native code
for four processor architectures, stored uncompressed, three of which no
single phone can run. Each APK now carries one architecture, unreachable code
is stripped from the release build, and the native libraries are compressed.
Noto is not on Google Play yet, so Android asks you to permit the install once
— that prompt is expected for anything from outside the store. Open the file
after it downloads and confirm.
Every APK is signed with Noto's own upload key rather than the debug key that
ships with the Android SDK and is byte-identical on every machine. The release
fails outright when that key is absent instead of falling back to the debug
key, which is why the intervening versions published without an APK rather
than with an unsafe one.
Documents on the phone are stored in on-device SQLite, the same local-first
arrangement as every other platform. There is no account, and no sync: notes
written on the phone stay on the phone for now.
Getting here
Four releases carried the desktop applications without the Android one, each
stopped by a different fault in the pipeline rather than by anything wrong with
the application. Recorded because the fixes are worth keeping:
- A macOS packaging step that hung instead of failing took a whole release down
with it, reported only as "cancelled". Long-running build steps now have
deadlines of their own and are retried. - Publishing waited for the desktop and web builds but not the mobile one, so
it ran a quarter of an hour before the APK existed. The file was built
correctly every time and simply arrived too late to be attached. - Stamping the release version rewrites the workspace manifests, and the step
that generated the native Android project was scoped to one package — so the
package manager pruned the dependencies the rest of the build needed, and
that step then hung until the job timed out. - The keystore check reported "not set" for every failure, including a key that
was plainly set but malformed. It now counts what it received and verifies
the password and alias open the keystore before twenty minutes of Gradle.
Known limitations
Unchanged: the desktop installers are unsigned, so Windows SmartScreen and
macOS Gatekeeper warn on first launch — verify your download against
SHA256SUMS.txt. macOS auto-update needs a signed build, and Windows ARM64 is
installer-only. iOS is not published. Cloud sync is not enabled on any
platform.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.1.6-win-x64.exe |
| Installer (ARM64) | Noto-1.1.6-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.1.6-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.1.6-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.1.6-mac-arm64.zip |
| Archive (Intel) | Noto-1.1.6-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.1.6-linux-x64.AppImage |
| Debian package (x64) | Noto-1.1.6-linux-x64.deb |
| RPM package (x64) | Noto-1.1.6-linux-x64.rpm |
Android
| Package | File |
|---|---|
| APK (64-bit) | Noto-1.1.6-android.apk |
| APK (32-bit) | Noto-1.1.6-android-armeabi-v7a.apk |
| App bundle (Play Store) | Noto-1.1.6-android.aab |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
What's Changed
Other Changes
- Merge pull request #2 from utkarsh032/dev by @utkarsh032 in #3
Full Changelog: v1.1.5...v1.1.6
NOTO v1.1.5
The Android APK, published on the download page at last.
1.1.3 and 1.1.4 shipped the desktop applications without it. Two faults in the
release pipeline were responsible, both fixed here, and neither was ever a
problem with the Android application itself.
Android
The download page now offers an Android build for phones running Android 7.0
or later. The recommended download is the 64-bit APK, which every phone made
since roughly 2016 wants; a 32-bit build is published alongside it for older
hardware.
It is a 16 MB download. The generated Android project would have made it 104
MB for an application whose JavaScript is 2.2 MB: one APK carrying native code
for four processor architectures, stored uncompressed, three of which no
single phone can run. Each APK now carries one architecture, unreachable code
is stripped from the release build, and the native libraries are compressed.
Noto is not on Google Play yet, so Android asks you to permit the install once
— that prompt is expected for anything from outside the store. Open the file
after it downloads and confirm.
Every APK is signed with Noto's own upload key rather than the debug key that
ships with the Android SDK and is byte-identical on every machine. The pipeline
fails outright when that key is absent instead of falling back to the debug
key, which is why 1.1.3 published without an APK rather than with an unsafe one.
Documents on the phone are stored in on-device SQLite, the same local-first
arrangement as every other platform. There is no account, and no sync: notes
written on the phone stay on the phone for now.
Why it took three releases
The first fault was an ordering one. Publishing waited for the desktop and web
builds but not for the mobile one, so it ran the moment the desktop packages
were ready — about eighteen minutes in, while the Android build still had five
minutes to go. The APK was built correctly and then simply arrived too late to
be attached, every time. Publishing now waits for mobile, while still refusing
to let a skipped or failed mobile build withhold the desktop packages.
The second was subtler. Stamping the release version rewrites six manifest
files, and the command that generated the native Android project was scoped to
one workspace package — so the package manager reconciled node_modules to
that narrow scope first, removing 133 packages that the rest of the build
needed. The generation step then hung silently until the job timed out
forty-five minutes later. It runs unscoped now, and every long-running build
step has its own deadline, so a stall costs minutes and says what happened
rather than taking a release down without explanation.
Known limitations
Unchanged: the desktop installers are unsigned, so Windows SmartScreen and
macOS Gatekeeper warn on first launch — verify your download against
SHA256SUMS.txt. macOS auto-update needs a signed build, and Windows ARM64 is
installer-only. iOS is not published. Cloud sync is not enabled on any
platform.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.1.5-win-x64.exe |
| Installer (ARM64) | Noto-1.1.5-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.1.5-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.1.5-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.1.5-mac-arm64.zip |
| Archive (Intel) | Noto-1.1.5-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.1.5-linux-x64.AppImage |
| Debian package (x64) | Noto-1.1.5-linux-x64.deb |
| RPM package (x64) | Noto-1.1.5-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
What's Changed
Other Changes
- fix(mobile): stop the version stamp from gutting node_modules before … by @utkarsh032 in #1
- Merge pull request #1 from utkarsh032/main by @utkarsh032 in #2
Full Changelog: v1.1.4...v1.1.5
NOTO v1.1.4
Noto for Android, published as an APK you can install from the download page.
1.1.3 shipped the desktop applications but not the Android build: the signing
job refused to run without an upload key, which is what it is supposed to do
rather than publish an APK signed with Android's shared debug key. That key now
exists, so this release carries the APK 1.1.2 and 1.1.3 both promised.
Android
The download page now offers an Android build for phones running Android 7.0
or later. The recommended download is the 64-bit APK, which every phone made
since roughly 2016 wants; a 32-bit build is published alongside it for older
hardware.
It is a 16 MB download. The generated Android project would have made it 104
MB for an application whose JavaScript is 2.2 MB: one APK carrying native code
for four processor architectures, stored uncompressed, three of which no
single phone can run. Each APK now carries one architecture, unreachable code
is stripped from the release build, and the native libraries are compressed.
Noto is not on Google Play yet, so Android asks you to permit the install once
— that prompt is expected for anything from outside the store. Open the file
after it downloads and confirm.
Documents on the phone are stored in on-device SQLite, the same local-first
arrangement as every other platform. There is no account, and no sync: notes
written on the phone stay on the phone for now.
Signed with a real upload key
Every APK here is signed with Noto's upload key rather than the debug key that
ships with the Android SDK and is byte-identical on every machine. That
distinction matters more than "unverified" suggests: anyone can sign an APK
with the debug key, and Android would accept it as a legitimate update to Noto.
The pipeline fails outright when the key is absent instead of falling back to
the debug key, which is exactly what happened on 1.1.3.
Everything from 1.1.3
The desktop applications, the download page that only links files a release
actually carries, and the packaging fixes that stopped a hung build from
cancelling an entire release are all unchanged from 1.1.3. Nothing on the
desktop needs updating for this release.
Known limitations
Unchanged: the desktop installers are unsigned, so Windows SmartScreen and
macOS Gatekeeper warn on first launch — verify your download against
SHA256SUMS.txt. macOS auto-update needs a signed build, and Windows ARM64 is
installer-only. iOS is not published. Cloud sync is not enabled on any
platform.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.1.4-win-x64.exe |
| Installer (ARM64) | Noto-1.1.4-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.1.4-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.1.4-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.1.4-mac-arm64.zip |
| Archive (Intel) | Noto-1.1.4-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.1.4-linux-x64.AppImage |
| Debian package (x64) | Noto-1.1.4-linux-x64.deb |
| RPM package (x64) | Noto-1.1.4-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v1.1.3...v1.1.4
NOTO v1.1.3
Noto for Android, published as an APK you can install from the download page.
This is the release 1.1.2 was meant to be. That version was tagged but never
published: one packaging job stopped responding, and the run was cancelled
before it could attach a single file. Nothing was ever downloadable under
1.1.2, and everything it promised is here.
Android
The download page now offers an Android build for phones running Android 7.0
or later. The recommended download is the 64-bit APK, which every phone made
since roughly 2016 wants; a 32-bit build is published alongside it for older
hardware.
It is a 16 MB download. The generated Android project would have made it 104
MB for an application whose JavaScript is 2.2 MB: one APK carrying native code
for four processor architectures, stored uncompressed, three of which no
single phone can run. Each APK now carries one architecture, unreachable code
is stripped from the release build, and the native libraries are compressed.
Noto is not on Google Play yet, so Android asks you to permit the install once
— that prompt is expected for anything from outside the store. Open the file
after it downloads and confirm.
Documents on the phone are stored in on-device SQLite, the same local-first
arrangement as every other platform. There is no account, and no sync: notes
written on the phone stay on the phone for now.
Signed with a real upload key
Expo's generated Android project signs release builds with debug.keystore —
the well-known Android debug key that ships with the SDK and is byte-identical
on every machine. An APK signed with it is not merely unverified: anyone can
sign their own APK with the same key and Android will accept it as a
legitimate update to Noto.
The release pipeline was already passing an upload keystore through the
environment, and nothing was reading it. apps/mobile/android is regenerated by
expo prebuild on every build, so the signing configuration had been reverting
to the template's on each run, silently. It is now applied by a config plugin
that runs as part of that regeneration, and a release fails outright rather than
publishing an APK carrying the shared debug key.
The download page only links files that exist
Not every release publishes every platform — Android is built only when the
mobile job runs. The page now checks each file name against the assets the
release actually carries, and shows the platform as unavailable when the file
was never uploaded. Previously a package could be listed for a release that had
no such file, which meant a download button pointing at a 404.
A hung build no longer costs a release
Packaging is the one release step that hangs rather than fails. hdiutil,
which builds the macOS disk image, intermittently stops responding on the
hosted build machines — no output, no error, nothing in the log. That is what
happened to 1.1.2: macOS on Apple Silicon sat in that step for the full
45-minute limit while the other four platforms finished in under three, and
the timeout cancelled the whole run. Four working installers were built and
discarded.
Each attempt now has a deadline of its own and is retried, so a stall that
clears on a second try costs a few minutes instead of the release. A build
that is genuinely broken now fails, loudly, rather than being reported as
cancelled — which reads like somebody pressed stop.
Re-running a release by hand was also unsound: the jobs that build the
packages checked out whichever branch the run was started from, while the
version stamped into them came from the tag. The two could disagree, and
nothing would have said so. Every job now builds the tag it was asked for.
Also in this release
- The Android Studio guide covers the JDK 17 requirement, which matters more
than it sounds: building on the JetBrains Runtime bundled with Android Studio
fails the native build with a message that names neither the JDK nor the
cause. - Code signing documentation gains an Android section, including what happens
if the upload keystore is ever lost.
Known limitations
Unchanged from 1.1.1: the desktop installers are unsigned, so Windows
SmartScreen and macOS Gatekeeper warn on first launch — verify your download
against SHA256SUMS.txt. macOS auto-update needs a signed build, and Windows
ARM64 is installer-only. iOS is not published. Cloud sync is not enabled on any
platform.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.1.3-win-x64.exe |
| Installer (ARM64) | Noto-1.1.3-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.1.3-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.1.3-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.1.3-mac-arm64.zip |
| Archive (Intel) | Noto-1.1.3-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.1.3-linux-x64.AppImage |
| Debian package (x64) | Noto-1.1.3-linux-x64.deb |
| RPM package (x64) | Noto-1.1.3-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v1.1.2...v1.1.3
NOTO v1.1.1
A fix for a packaging defect that stopped the Windows desktop application from
starting at all.
If you installed 0.1.0 on Windows
Download and install this release. The 0.1.0 installer completed successfully
and then the application never opened a window — it could not, for the reason
below. Automatic updates cannot rescue it either, because the failure happened
before the updater was reached, so a manual download is the only way forward.
Your documents are unaffected. They live in SQLite under your user data
directory and were never touched by the fault.
What was wrong
The desktop application stores documents through Node's built-in node:sqlite.
That module is still marked experimental, and so it is absent from the
builtinModules list that the main-process bundler used to decide what to leave
external. It was therefore treated as an ordinary dependency, could not be
resolved, and was replaced with an empty module — with a build warning rather
than a build failure.
The packaged application then tried to open its database against nothing at all.
That happens during startup, before the first window is created, and the
resulting error was discarded rather than reported: no window, no message, no
log. The application simply exited.
Two changes fix it. node:sqlite is now declared external explicitly instead of
being inferred, and an import the bundler cannot resolve now fails the build
outright. The second matters more than the first: it is what stops this shape of
defect from ever again passing as a successful build.
Also in this release
- The desktop release pipeline now bakes the target environment and update
channel into the package, verifies the Squirrel update manifest's SHA1, size
and version against the payload it names, and refuses to publish an
incomplete or stale set of artifacts. - A guide to running the mobile application under Android Studio.
Known limitations
Unchanged from 0.1.0: the installers are unsigned, so Windows SmartScreen and
macOS Gatekeeper warn on first launch — verify your download against
SHA256SUMS.txt. macOS auto-update needs a signed build. Windows ARM64 is
installer-only. Mobile applications are not published yet, and cloud sync is not
enabled.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-1.1.1-win-x64.exe |
| Installer (ARM64) | Noto-1.1.1-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-1.1.1-mac-arm64.dmg |
| Disk image (Intel) | Noto-1.1.1-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-1.1.1-mac-arm64.zip |
| Archive (Intel) | Noto-1.1.1-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-1.1.1-linux-x64.AppImage |
| Debian package (x64) | Noto-1.1.1-linux-x64.deb |
| RPM package (x64) | Noto-1.1.1-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v0.1.0...v1.1.1
NOTO v0.1.0
The first published release of Noto.
This is an early build. The foundation — the editor, local storage on every
platform, and the release pipeline that produced these downloads — is in place
and working. Expect gaps, and expect them to close.
Highlights
- Desktop applications for Windows, macOS and Linux, with automatic updates
on Windows and macOS. - Web application that runs in the browser with nothing to install and keeps
working offline once loaded. - Local-first storage. Documents live on your device — SQLite on the
desktop, IndexedDB in the browser. No account, no server, no telemetry. - A rich text editor built on ProseMirror: headings, lists, quotes, code
blocks and inline formatting, with autosave.
Known limitations
- Mobile applications are not published yet.
- Cloud sync is not enabled;
packages/syncships the contract and a local-only
engine so it can be turned on later without a rewrite. - The installers are unsigned. Windows SmartScreen and macOS Gatekeeper will
warn on first launch until code-signing certificates are in place. Verify your
download againstSHA256SUMS.txtin the meantime. - macOS auto-update requires a signed build, so it does not work in this
release. Windows auto-update does. - Windows ARM64 is installer-only and does not auto-update; a single Squirrel
update feed cannot serve two architectures.
Downloads
Windows
| Package | File |
|---|---|
| Installer (x64) | Noto-0.1.0-win-x64.exe |
| Installer (ARM64) | Noto-0.1.0-win-arm64.exe |
macOS
| Package | File |
|---|---|
| Disk image (Apple Silicon) | Noto-0.1.0-mac-arm64.dmg |
| Disk image (Intel) | Noto-0.1.0-mac-x64.dmg |
| Archive (Apple Silicon) | Noto-0.1.0-mac-arm64.zip |
| Archive (Intel) | Noto-0.1.0-mac-x64.zip |
Linux
| Package | File |
|---|---|
| AppImage (x64) | Noto-0.1.0-linux-x64.AppImage |
| Debian package (x64) | Noto-0.1.0-linux-x64.deb |
| RPM package (x64) | Noto-0.1.0-linux-x64.rpm |
The web application needs no download and is always at the latest version.
Verifying a download
Checksums for every asset are published as SHA256SUMS.txt.
sha256sum --check --ignore-missing SHA256SUMS.txtUpdating
Windows and macOS installations update themselves: Noto checks for a new version on startup, downloads it in the background, and applies it on the next restart.
On Linux, replace the AppImage or install the new .deb/.rpm through your package manager.
System requirements
| Platform | Requirements |
|---|---|
| Windows | Windows 10 or later, x64 or ARM64, 4 GB RAM, 500 MB storage |
| macOS | A supported modern macOS version, Apple Silicon or Intel, 4 GB RAM, 500 MB storage |
| Linux | x64, 4 GB RAM, 500 MB storage |
| Web | A current version of Chrome, Edge, Firefox or Safari |
Full details: System requirements
Full Changelog: v0.1.0-beta.3...v0.1.0