Show HN: Edna, note taking app for developers (edna.arslexis.io)
Edna is a note taking app for developers and power users. A cross between Obsidian and Notational Velocity.
Markdown, plain text, code, works in browser so no installation required, private (notes are stored in your browser or disk) and secure (can encrypt notes with a password).
The story so far.
I was always attracted to editors with minimalistic UI, like https://mak.ink/, simplenote, Notational Velocity. I like having most of the screen estate for writing because writing and editing is what note taking apps are for.
But: most of them are very thin on features and UI.
I saw Heynote and it was one of those minimalistic writing UIs with not many features.
I liked their concept of dividing notes into blocks so I forked Heynote and started coding.
The goal was to combine writing-oriented, minimalistic main UI while also providing on-demand UI for features and efficient operation. Things like context menu, type-down note switcher, command palette, quick access shortcuts, plenty of keyboard shortcuts.
Another goal was privacy and security. The notes never leave your computer and can be encrypted with a password. It also makes the code simpler because I don't need any backend storage, user accounts and auth etc.
Sadly, only Chrome and Edge provide the necessary file system api, on other browser you can only store notes in local storage, which means no sharing between computers or accessing the notes with other software.
40 working days and 528 commits later, here's what I've added:
* added support for multiple notes
* ability to store notes on disk
* and if you store notes in a directory managed by DropBox, OneDrive etc., you get sharing of notes between computers
* Ctrl + P: UI for switching between notes, creating new notes, deleting notes, inspired by Notational Velocity
* Ctrl + Shift + P: command palette like in vs code
* context menu to access frequently used functionality
* Ctrl + E to open note from history (list of recently opened notes)
* ability to assign Alt + 0 ... Alt + 9 quick access shortcuts
* ability to encrypt notes with a password
* export all notes to a .zip file
* automatic, daily backup of notes to a .zip file (optiona, see Settings)
* Ctrl + B to navigate between blocks
* re-designed Settings UI
* added ability to execute Go blocks
* support Svelte and Vue in code blocks
* ported the UI code from Vue to Svelte 5, just because I could
* converted from desktop app to run in the browser
(Ctrl is on Windows, on Mac it's ⌘).I've been using it daily while working on it. 94 notes and counting.
I still have ideas for improvements but it has all the core features for productive work.
The app: https://edna.arslexis.io/
The code: https://github.com/kjk/edna
96 comments
[ 377 ms ] story [ 3922 ms ] threadSame with plain old websites if they're made to run offline (e.g. https://devdocs.io/offline).
Store notes on disk (https://edna.arslexis.io/help-win#storing-notes-on-disk) and you can auto commit the whole directory with git.
Personally I store my notes (encrypted with a password) on directory managed with OneDrive.
Edna also auto-saves files.
I store my notes (encrypted with a password) on OneDrive.
See https://edna.arslexis.io/help-win#storing-notes-on-disk
I even have a settings option for a daily backup which exports all notes into a single .zip file in `backups` sub-directory. Not sure if it makes much sense, but it's there.
You can install a PWA shortcut which gives you even more desktop experience in the sense that it looks like an app separate from the browser.
That is what I do.
What are those corporate rules and how are they enforced?
Is it about storing data? Because Edna stores the notes on your computer, it's never sent to any server.
Whereas if I have an installer or an electron app, I can copy it to a thumb drive and install it years later on a totally different machine even if your website is long gone.
I personally dislike PWAs because they gave the deceptive illusion that you're installing an actual application as opposed to just a bunch of ephemeral stuff that's thrown inside the user data folder of the respective browser.
What is required to add additional language support?
To add another one, you need to find library that implements CodeMirror mode for that language, add it to package.json and update languages.js
One of the default notes is `scratch` for exactly that and you can summon it quickly with `Alt + 1`
If you have something you want to write down to be able to reference in the future, create a note and put that in it. The next time you want to write something down, you can either put it in the note you already created, or you can make another note if that sounds nicer. Up to you. You'll find out what works.
You can do basically what you're doing right now, which is opening a random file and putting it in there, except now instead of your files being spread across your system they're all in one place, and if you want to start doing fancier stuff with them in the future you can. I use a small percentage of Obsidian's features, and they don't get in my way if I'm not using them.
One optimization that might be interesting is to simply use Markdown as your main document all the time and then when you want to add special functionality like the math block to simply have that as a code block in Markdown. For example, using the triple back tick followed by the word math. Then anything inside of that math block works just like you already have.
This also makes it easy to add other types of blocks incrementally.
One challenge for me in reading the sample document was that it wasn’t clear that a math block was a math block without the comments that you wrote. Using the triple back tick with the block type would solve that problem
I've been thinking about making math an option within markdown.
The type of the block is shown at the bottom, in the status bar.
For example, ```tasks blocks are used in Obsidian Tasks to denote queries. The extension replaces the block with the rendered task list, when in wysiwyg editing or in the rendered view.
In your case the results would just appear, a la soulver, but the way of setting it up would be familiar.
You can see implementation: https://github.com/kjk/edna/blob/main/src/editor/emacs.js
I can't say how well it works. I just noticed that I would need to change some keybindings because they conflict with Emacs keybindings.
I love that yours is web based! Can see it being much more reusable in a number of use-cases.
Calca was originally MacOS/iOS, but has since been ported to Windows.
I think that the notation in Calca to use a `=>` to display results maybe adds a bit more clarity to the math expressions, but your display style seems to work pretty well too.
The only advantage Calca seems to have is they’ve had almost a decade to add things like extra functions (compound interest, trig, …), constants, operators, etc.
I’ve always thought that style of simple but highly visible calculation is a far superior alternative to spreadsheets. Jupyter, LiveBook, Mathematica, etc… have shown that it works, but the world is still enamored with Excel, despite its propensity to hide mistakes.
Which I respect but I needed at least multiple notes, bringing this much closer to apps like Obsidian, Bear etc.
And then I added a bunch of features that I wanted to have, like UI for opening/creating/deleting nots inspired by Notational Velocity, encryption, command palette, history, Ctrl + B for navigating between blocks.
Edna is basically a superset of Heynote: it does everything Heynote does and lots more.
So yeah, the vision is pretty different.
I should add offline mode.
If you need some specific PWA functionality that isn't there, please open an issue at https://github.com/kjk/edna/issues
I have been using that for quite a while and I like it.
Ctrl/Cmd + P = Print Ctrl/Cmd + Shift + P = New Private Window
Further, because I don't type in QWERTY, I noticed that _some_ shortcuts seem correctly mapped in my layout, but others are not. The Option+N shortcut for a new note just starts the "˜" combining character (expecting a following character like "n" to form "ñ") when using the "n" key in my layout. However it works if I use the physical "n" key (which is my "k").
I feel like that explanation is pretty poor, but yeah basically some shortcuts seem bound to the physical key location whereas others seem bound to the mapped key. I wonder if they are declared differently?
`Alt + N` for new scratch note is implemented via `Mod-n` CodeMirror keymap (keymap.js) so I'm not sure why it wouldn't work.
Ctrl + K was actually the first. Ctrl + O because it's naturally "open". And you can switch to command palette with `>`, like in vs code.
I've added Ctrl + P and made it the documented one because I also use VS Code heavily and I was tired of context switching.
It's unfortunate that it conflicts with browser's Print but I figured that you do this often and print rarely.
The ultimate solution, of course, is to allow customizing keybindings.
I guess the OG NV didn’t have that but I used them pretty extensively in nvAlt and in Obsidian (not that I’d expect anywhere near what the latter does with analyzing them).
1. https://notational.net
Thanks so much for the high quality, light-weight, native applications you put out. You're a saint.
That said, I will not eat the bugs, and I will not live in the browser. Project isn't for me. But I just wanted to say that you always have my attention.
A relatively simple thing would be to add "preview block" which e.g. for mermaid blocks would add a panel with rendered diagram.
A much more complicated solution would be to add codemirror view which renders diagram when cursor is outside the markup and switches to editing when inside markup.
But that's significantly more complicated.
A much better UI would be something like what you described, such as
- https://github.com/benrbray/prosemirror-math?tab=readme-ov-f...
- https://support.typora.io/Math/#inline-math
Heynote is ~200mb, eats a lot of ram, I think I am switching over to this.
https://github.com/heyman/heynote/blob/main/LICENSE
https://github.com/kjk/edna/blob/main/LICENSE
CMD + L is not working on Safari, since it will open the address bar.
Or: context menu (right click), Block / Change Language.
Or: command palette, "Block: Change Language" command.
SB can be hosted on Docker, which has the benefit of being able to access your data from any device. Do you have any such plans for Edna?
Earlier I also made a fork of silverbullet: https://notedapp.dev/ with similar goals to Edna (which is a fork of heynote).
But don't use it. I stopped working on it half-way. In retrospect, I've made a mistake there of doing my note storage backend.
Then I was thinking about re-starting it and re-doing the backend for notedapp but then I saw heynote and used that as a based and I'm quite happy with the result.
I do like SilverBullet so it's a possibility that I'll do another project which combines the UX ideas of Edna with SilverBullet editing UI. But for now I still have some ideas for Edna, will keep me busy for at least a week :)
You can then access the note on every computer where you replicate that folder.
This doesn't cover accessing from mobile or computers you don't own but it's just a different kind of a problem of auth.
Edna is actually a self-contained go binary that you could run yourself on a server or your desktop.
Currently the backend (Go server) is there to just serve HTTP files but it wouldn't be hard to add storage API to Go server and modify Edna to use that. I already have 2 storage backends: local storage and file system api.
I would say it would be at most a few days of work to make it work similarly to SB but that's not something I plan right now. I still have some UI functionality to add to Edna and then we'll see.
Executing JavaScript safely is actually hard. You don't want to just execute code in browser context because then an attacker could trick you to execute his JavaScript code and e.g. grab all your notes.
So you need to sandbox it via e.g. iframe or by running using wasm-compiled quickjs
Which is something I might do.
Additionally I'm thinking about allowing to run a javascript function over content of a block so e.g. you could base64-encode a text block etc.
By convention, if a note has html block and javascript block (and optionally css block), I could consider that a small website with index.html, index.js and index.css files and provide a preview of html output.
- Silverbullet.md (https://silverbullet.md)
- Eidos (https://eidos.space/)
- and this ofc (https://edna.arslexis.io/)
Is someone aware of more of these?
I am liking all of them and they seem to have different perspectives, goals and philosophies.
Sadly none of them have a quick capture experience on android that I am satisfied with...
How would that experience look like? (I think I'm after the same thing!)
Ideally, note capture is as easy as screenshots. It means removing nonessential menus, decisionmaking, buttons, etc. For example, having the app start with an editor and keyboard open, versus having the app start with a list of existing notes. It may mean gesture shortcuts.
For a published app with adjacent ideas, check out Bebop for iOS: https://www.jackcheng.com/bebop-design-dev-process/
Desktop only (Mac currently) though, with windows on the way. Most likely will never have a web version.
Source: Me who built it
Windows/Linux both are on the way. Have builds ready for both, but need to polish some things, and make the pipeline a bit more streamlined.
I guess a "cooking" block would go a long way - at least for me!