Skip to content


Folders and files

Last commit message
Last commit date

Latest commit


Repository files navigation


This is my implementation of a note-taking app, organized around the following principles:

  • Linking creates structure as necessary. Having to choose a category or folder for notes just makes me tired. I want to write and connect stuff as I think of it. Structure will emerge where it needs to! I should also be able to see all linked/unlinked references to a note.

  • Notes are for me. Sharing is important but secondary, and exporting should be fine in most cases. Note, though, that this means I want importing to work great so I can slurp in stuff from multiple places!

  • Anything I can see, I can edit. There should be as few read-only views in the app as I can manage.

  • Keyboard shortcuts for the win. I want to be able to navigate completely with the keyboard. Vim-ish keybindings, if possible!

  • If I can't organize things I need to do, I'm not going to use the tool. It should handle TODOs nicely (due/defer, mark/complete/cancel, recurrence rules?) It should also be possible to reorder/filter todos in some sort of aggregate view.

  • Aggregate views reveal structure. These look like queries. Maybe I want to see only the first marked TODO in each note? Should be doable.

Keyboard Shortcuts

Shortcut Action Implemented
Alt-Up Move edit cursor up No
Alt-Shift-Up Move node up No
Alt-Down Move edit cursor down No
Alt-Shift-Down Move node down No
Alt-Right Move edit cursor to first child No
Alt-Shift-Right Indent No
Alt-Left Move edit cursor to parent No
Alt-Shift-Left Dedent No
Tab Indent Yes
Shift-Tab Dedent Yes
Enter Split node at cursor Yes
Backspace Join nodes Yes
Esc Stop editing Yes

Interaction Ideas

  • It'd be cool to be able to select/export a group of notes. These could either be viewed in a read-only mode or imported into someone else's database. I guess it would also be possible to structure the export with CRDTs for easy merges.
  • It'd be cool to persistently save a database somewhere shared, but that potentially violates the "no formal structure" principle so it needs to be done carefully.
  • It'd be super slick to do something like idea fight where one could order the children of a node.

Next things to do

  • basic tree editing
    • ability to move a node up and down as well as in and out
      • moving up and down to siblings
      • if you're at the first child, moving up goes to the parent.
      • if you're at the last child, moving down goes to the parent's next sibling.
  • persistence
  • nice design
  • navigation by link
  • sidebar improvements
    • display and sort by last modified time
    • show first couple rows of content
  • package to be deployed by Nix
  • links to a note should change if you change the title
  • backlinking
  • syncing with CouchDB / PouchDB servers
  • the module layout reflects some old design ideas (Node.Content, Node being separate from Database.Row)
  • too many things are named Node. There's Node, Node.Content.Node, and I think a few others
  • there aren't any inline formats. I'd like italic, bold, and inline code at a minimum. Possibly :highlights: or ~strikethrough~ too?
    • I'd like a few more block formats too... > for blockquotes in particular
  • default selection to the end of the text box
  • show the incoming links along with their titles
  • fix encoding issue on serving
  • make it possible to edit an empty node
  • get rid of onBlur handler (just use esc)
  • I'd really like some level of autocomplete for note titles in notes
  • auto-link URLs
  • hitting backspace at the beginning of a non-empty node should not delete it
  • automatically create notes when they're first linked?
  • only show incoming links for notes, not nodes
  • profile some large notes and try to make them much faster
  • brackets are valid syntax for non-link reasons. Don't block that!
  • don't discard content as easily when something's invalid ] ]
  • change the page title to the current note
  • tree editing
    • moving edit focus around
      • hitting alt-up and alt-down should go to the previous/next sibling
    • refinements on existing behavior
      • move to the previous sibling when I backspace through a node
      • hitting tab/shift-tab should preserve the cursor position, if possible
        • Html.Keyed? Blocking keyup defaults as well as keydown?
      • alt-shift-up and alt-shift-down to move nodes
      • preserve cursor position when joining nodes with backspace (put it at the join point)
      • delete selected text when splitting with enter (but if it's collapsed, no change)
      • alt-enter or shift-enter or something should insert a linebreak in the current node
      • cmd-enter should close the node in addition to Escape
  • search
    • finding nodes and navigating to their notes
    • backlinks
  • come up with a consistent design for keybindings (e.g. alt moves edit, alt+shift moves node)
  • offline support (webworker, caching?)
  • exporting to
    • (likely) markdown
    • (less likely) rich text of some kind
  • allow multiple notes to be edited concurrently
  • more metadata (todos, etc)

Notes to Self

elm-rte-toolkit looks cool, and it may make sense to add it later, but don't go for the complexity now! Keep things simple as long as possible!


Prior Art

  • Roam does bidirectional links amazingly well.
  • Bear has a really nice user experience.


TODO: I need to add this to an in-app page somewhere.

  • chick by Symbolon from the Noun Project


No description, website, or topics provided.






No releases published


No packages published