Appearance
Notes
Markdown notes, organized into collections
Overview
Notes is a Notion-style Markdown notebook. You organize your writing into collections (think of a collection as a notebook, e.g. one per book or topic), and each collection holds one or more Markdown pages. A sidebar tree lets you expand a collection to reveal its pages, and an editor with an optional live preview sits alongside. It is part of the kimtos new-tab app suite.
Everything is fully on-device. There is no backend, no account, and no network: every collection and page lives in your browser's IndexedDB and never leaves the machine.
Highlights
- Collections & pages — a sidebar tree of collections, each expanding to its pages. Create, rename, move, and delete from right-click menus.
- Markdown editor — write GitHub-flavored Markdown with headings, lists, tables, links, and fenced code blocks with syntax highlighting.
- Edit / Split / Preview — write in source, see a live preview, or split the pane and do both. Edits autosave.
- Find & replace —
⌘/Ctrl+Fopens a find bar; every match is highlighted, with match-case, previous/next, replace, and replace-all. - Internal links — link from one page to another with a plain Markdown link, within a collection (
this:page) or across collections (collection:page). - Export as Book — read a whole collection as one continuous document, with internal links navigating in the reading view.
- Export & download — download a page as
.md, a collection as a.zip, or export either to PDF through your browser's own print dialog. - Floating window — pop the app out into a small, always-on-top window so your notes stay visible while you browse other tabs.
- Batch delete with undo — multi-select collections and pages, delete in one step, and undo for 30 seconds.
Privacy model
Notes writes only to local browser storage:
- Collections (name, last-updated time) are records in IndexedDB.
- Pages (title, Markdown content, last-updated time) are records in IndexedDB, each linked to its collection.
- Nothing is uploaded, and there are no analytics or third-party calls.
Markdown is rendered client-side purely for an instant preview and for export — all of your data and logic stays local. Because each page is plain Markdown text, your work is portable: it travels with the browser profile and is included in the suite's local backup.
Getting Started
Open Notes from the dock. On first run, if you have no collections yet, it offers New collection to get started. After that, your most recently worked-on collection opens automatically, with its first page in the editor.
Collections and pages
The left sidebar is a tree: collections at the top level, their pages nested underneath.
- New collection — the + button in the sidebar header.
- New page — expand a collection and click New page at the bottom of its page list.
- Expand / collapse — click a collection to show or hide its pages.
- Open a page — click it to load it into the editor.
- Rename, move, delete — right-click a collection or page for its menu.
- Move a page — drag it onto another collection, or use Move to collection… in its right-click menu.
- Resize the sidebar — drag the divider; the ☰ button toggles it.
Every edit autosaves a moment after you stop typing. Deleting a page or a whole collection can be undone for 30 seconds via the toast that appears.
The Markdown editor
Write in GitHub-flavored Markdown: headings, lists, tables, links, and fenced code blocks (syntax-highlighted for many languages). Pages are capped at 50,000 characters; the counter in the toolbar shows how close you are.
Switch panes with the toolbar tabs:
- Edit — the source textarea only (the default).
- Split — source and live preview side by side; drag the divider to resize the two panes.
- Preview — the rendered result only.
When the window is too narrow for two panes, Split falls back to Edit automatically until there is room again.
Find & replace
Press ⌘/Ctrl+F (or the search icon) to open the find bar. Every match is highlighted in the source.
- Enter / Shift+Enter — jump to the next / previous match.
- Aa — toggle match case.
- Replace — change the current match; All — replace every match in one undoable step.
- Esc — close the bar.
Replacements join the editor's native undo history, so ⌘/Ctrl+Z undoes them just like typing.
Internal links
Link from one page to another using an ordinary Markdown link whose target is a page reference instead of a URL:
- Same collection:
[text](this:page_name) - Another collection:
[text](collection_name:page_name)
Names are normalized — spaces and dashes become _ and case is ignored — so a page titled "Page Title" is referenced as page_title. In the editor's preview, clicking an internal link opens the target page; in Book view it navigates within the reading view.
Export as Book
From a collection's right-click menu, choose Export as Book to read the whole collection as one continuous, rendered document (pages in oldest-first order). Internal links navigate within the book, and the ← button steps back through where you have been; the ⬇ icon exports the book to PDF.
Export and download
From the right-click menus (or the Book view):
- Download a page as a
.mdMarkdown file. - Download a collection as a
.zipcontaining one.mdfile per page, inside a folder named after the collection. - Export as PDF — for a single page or a whole collection. This opens your browser's print dialog; choose Save as PDF. Each page in a collection export starts on its own sheet. Everything stays on your device.
The floating window
If your browser supports it, a pop out button appears in the title bar (you can turn this off in settings). It moves the app into a small, always-on-top floating window — the same browser feature Google Meet uses — so your notes stay visible while you work in other tabs. Keep the original tab open; the floating window lives only as long as that tab does.
Deleting several at once
Click Select in the sidebar to enter multi-select mode. Tick pages, or pick whole collections (which selects all of their pages too), then Delete (N) removes them in one step. You can also drag across collection rows to select a range. A single confirm covers the batch, and one Undo restores everything.
Architecture
Notes follows the suite convention: all data logic lives behind the local API layer, and the app itself is UI plus client-side Markdown rendering. The code lives in extension/src/apps/notes/.
Modules
| File | Role |
|---|---|
index.ts | The app descriptor and UI — the collections/pages sidebar tree, the Markdown editor (Edit/Split/Preview), find & replace, internal links, Export as Book, PDF/.md/.zip export, and the floating-window control. |
notes.local.ts | The data layer — collections and pages CRUD over IndexedDB, registered on the local API router. Includes a one-time migration of legacy flat notes into a "My Notes" collection. |
marked + marked-highlight + highlight.js | Client-side Markdown parsing and code syntax highlighting, used for the live preview, Book view, and export. |
lib/pip.ts | The Document Picture-in-Picture helper that pops the UI out into an always-on-top floating window. |
Data flow
The UI never touches storage directly: it calls getApi / jsonApi (the suite's local router), which dispatches to notes.local.ts. Markdown rendering is purely a view concern — marked parses the source for the preview, the Book view, and PDF export, but the source of truth is always the plain Markdown text in storage.
Data model
Two record types, linked by id:
- Collection —
{ id, name, updated }. Itsupdatedtime is bumped whenever any of its pages changes, so the "recent" ordering reflects real activity. - Page —
{ id, collectionId, title, content, updated }, wherecontentis the Markdown text (capped at 50,000 characters).
Listing a collection returns a live page count; deleting a collection cascades to remove all of its pages. Moving a page rewrites its collectionId and bumps both the old and new collections' timestamps.
Persistence
Saves are debounced (~600 ms after the last keystroke) and flushed immediately before switching pages, so a fast switch never drops an edit. Deletes (and moves) are reversible for 30 seconds through an in-app undo toast that re-creates the removed records. Reopening the app restores the most recently edited collection and opens its first page straight from storage.
Reference
A quick reference for shortcuts, settings, internal links, and storage.
Keyboard shortcuts
| Keys | Action |
|---|---|
⌘/Ctrl + F | Open find & replace |
⌘/Ctrl + Z | Undo (including Replace) |
⌘ + Shift + Z / Ctrl + Y | Redo |
Enter | Next match (in the find bar) |
Shift + Enter | Previous match (in the find bar) |
Esc | Close the find bar (or a dialog) |
The Aa button in the find bar toggles match-case; Replace changes the current match and All replaces every match in one undoable step.
Settings
Open the app's settings to configure the floating window. These are per-app.
| Setting | Key | Options | Default |
|---|---|---|---|
| Floating window | popout | On, Off | On |
| Floating window size | pipSize | Compact, Standard, Large | Standard |
Floating window shows the "pop out" button in the title bar (it needs a browser that supports the feature; keep the original tab open). Floating window size sets how big the window first opens — you can still drag its edges to resize afterwards:
| Size | Opens at |
|---|---|
| Compact | 380 × 520 |
| Standard | 560 × 720 |
| Large | 880 × 940 |
Internal-link syntax
Write an internal link as a normal Markdown link whose target is a page reference. Names are normalized: spaces and dashes become _ and case is ignored (so "Page Title" → page_title).
| Syntax | Links to |
|---|---|
[text](this:page_name) | A page in the same collection |
[text](collection_name:page_name) | A page in another collection |
Anything that looks like a real URL (e.g. https://…, //…, #…, /…) is left as an external link and opens in a new tab; schemeless links get https:// added automatically.
Right-click actions
| Item | Actions |
|---|---|
| Collection | Export as Book, Rename, Download (.zip), Export as PDF, Delete |
| Page | Rename, Download (.md), Export as PDF, Move to collection…, Delete |
Data & storage
| Item | Where it lives |
|---|---|
| Collections (name, last-updated) | IndexedDB records |
| Pages (title, Markdown content, last-updated) | IndexedDB records, linked to a collection |
| Backup | Included in the suite's local Export / Import |
Pages are capped at 50,000 characters each. Deleting a collection also deletes its pages. Deletes and moves can be undone for 30 seconds. Nothing is ever uploaded.