Terminal app feedback/improvement ideas

A few months ago I made a bit of an analysis of the mobile app and where I think there are functionality gaps or areas for improvement.
I've recently found myself using the terminal app more and more, in particular I find myself using it over SSH to my main install from a Windows laptop that is on its last legs.
I actually think it is criminally underappreciated and seems to often fly under the radar a bit with all the focus on the desktop and mobile apps, the more I use it the more useful I find it.
However, like the mobile app, whilst it is perfectly functional it seems that it could do with a bit of love to bring it more in line with the main desktop app.

With the desktop or mobile apps it is really very easy to make direct comparisons with other mobile note taking applications but with the terminal app I'm really not sure of any good direct comparisons.
The most obvious things to compare against would be Emacs Org-mode (terminal mode - not GUI) or the Vim plugin VimWiki. I'm not overly familiar with Org-mode and VimWiki really is more of a linking and markup language than it is a "notes app" in its own right. Both are very impressive projects but neither are exactly what I would call user friendly and seem to have pretty severe learning curves (at least compared to the joplin terminal app).
The fact that the terminal app mirrors the default layout of the app is great for familiarity and the basic functions are really easy to learn.

There are however some changes I would love to see implemented to bring it in line with the desktop app for functionality and usability.

Specifically this topic is referring to the terminal app in terminal/TUI mode and not in shell/CLI mode.

Core functionality

I feel there are a couple of basic functions of the desktop app missing in the terminal app which would at least bring it up to date with the desktop app for basic usability.

  • Notebook promotion/demotion - Currently it seems there is no way to move notebooks around, specifically promoting/demoting notebooks in the tree, I know this isn't a new topic, there have been discussions and PRs around this but it seems this is yet to be solved. Unless you have a sync'd desktop app you are pretty much stuck with either a flat structure or the structure as configured from the desktop app.

  • Subnotebook creation - Related to the above, the desktop app has two commands newFolder and newSubFolder whilst it appears the terminal app only has access to mkbook which (apologies if I'm wrong) only seems to create at a root level and ignores use <notebook> or references to $b or notebook names.

  • Notebook folding - With a long list of notebooks it would be useful to have the ability to collapse and expand notebooks, for example right or left cursor when over a foldable notebook to expand and collapse respectively.

  • Plugin support - I know this one is mostly done to death but I think there could definitely be some scope for plugins for the terminal app. Something like the template plugin is an obvious target but I can certainly see scope for terminal only plugins like being able to define macros or run small scripts within the app itself as well as visual customisation (like tree branches on the notebooks pane), shortcuts bar or a powerline/status bar. The tkwidgets framework is already there so I'm assuming it would be a case of being able to register new widgets like the frames on the desktop app.

  • Markdown rendering - I usually accomplish this by using something like the vim-instant-markdown plugin which launches a node mini-server then opens a tab in your default browser but it would be nice to have a command that could launch such a preview directly from joplin to bypass needing options for every text editor. Or could this be an option for a potential plugin?

  • Goto anything - The / search function is totally serviceable but it seems (please correct if wrong) that can only show and display notes rather than other items like tags or notebooks.

  • Note counts per notebook - As with the desktop app - show the number of notes within a notebook after the notebook entry e.g. Programming (5)

UI/UX and usability improvements

I feel there could be a fair bit of potential improvement here that could have a lot of impact on the usability of the application. The default is certainly more than usable but I'd love to see customisation to the layout and UI like we can on the desktop as well as some tweaks that allows the app to be a bit more "app/TUI" like and a little less "CLI" like (i.e. increasing the interaction with the application using more than just commands in the console).
Many of these I feel could be implemented via plugin if it was extended for proper plugin support.

  • Pane resizing - It would be nice to be able to resize the panes "on the fly" via a command or keyboard shortcut. I've had a play with editing the source, manually setting the settings that influence the hLayout widgets directly in a number of ways. You can edit the config fairly easily e.g. :config layout.folderList.factor 2 but it seems that on setting the value the app has to be restarted to take effect.
    My thought would be that a shortcut could be defined to increment those values in steps which would then instantly redraw what is on screen which would allow dynamic resizing of the panes on the fly e.g :config layout.folderList.factor +0.2 could increment the stored value by 0.2 and the command itself when executed should be able to force a re-render of the note screen. What would be even better is if the middle section (layout.xxx.factor) could work as a variable depending on which pane currently has focus (i.e. one of folderList, noteList and noteLayout) and so the shortcut would only influence the pane that currently has focus.
    Alternatively a command could be run to enter a 'resize' mode where you can move focus between panes and use keys to widen or narrow the panes before leaving resize mode.

  • Pane layout - It would be nice to move the panes around as they can be on the desktop. I mostly work on an ultrawide monitor so in fullscreen it would actually be nice to move the console from a vwidget to an hwidget to make better use of the space or simply constrain it within another hwidget (e.g. within the note list, kind of like the sync console on desktop)

  • Colour customisation - Being a terminal app this obviously has some constraints but a configuration file to mark different elements of the application for different terminal colours would be welcome. For example I would quite like to better distinguish the notebook list structure via varying/alternating shades or colours or set different highlight colours or border colours.

  • Mouse support - Some more basic mouse support would be a nice addition - things like clicking the notebooks/notes to select or using the scroll wheel to navigate lists.

  • Quick keyboard navigation - I wish I knew what the proper name for this is but idea is similar to what you often have in various file browsers where you can type the first character of an item to quickly navigate to it.
    For example if my notebook tree was:

Programming
├──Javascript
│  ├──Electron
│  ├──Node.js
│  └──React
├──Java
│  └──Eclipse
└─SQL
   ├──PL/SQL
   └──T-SQL

Then a typing the combination of p->j->e would take me through the tree to Electron whereas p->s->t would take me to T-SQL. The obvious issue is with notebooks starting with the same letter so my solution would be that when duplicate letters are encountered it keeps looping through all 'j' notebooks until a pause is encountered when it jumps to the next level i.e hitting p in quick succession would highlight each notebook starting with 'p' until enough time has elapsed for the next keypress to act on the next level in the list.
e.g. We want to get to "Eclipse" then we would need to press p->j->j->(pause)->e
One glaring issue with that is it doesn't really fit with the "vim" style of the application so either this is already available through different functionality or this needs to be entered from within some kind of special command mode.

  • Search highlighting - Like in the desktop app it would be nice if the matching result(s) of a search could be highlighted within the notes pane

  • Pane length indicator - Show the length of the data in a given pane in some form, anything from a scrollbar to a % counter or even just a line indicator (e.g 4/52) etc.

  • Man page - The help command is good but partcularly for unix-like OSs it would be good to have a proper man page - I've actually started looking into this myself (Joplin man page) and intend to follow up

Future?

Things here I think are things that could be scoped for the future of the application, things that might be nice to aim for but are in no way essential to the core functionality (or maybe could be initial plugin ideas?).

  • Built-in editor - I know that nothing built into the application is likely going to rival what one could do in Vim or Emacs in terms or pure extensibility but a native editor would be a nice feature to edit directly in the app rather than forcing you to open in an external editor. I've had issues in the past (mostly when trying to use it via SSH) where Vim claims that the note has been deleted from the tmp directory whilst I've been in the middle of editing it - no idea if it is true but I copy my changes to clipboard and open it again. An inbuilt editor also means editing can be performed without the need to explicitly save the file - I've stupidly lost data in the past by not saving because I'm so used to the standard Joplin save-on-edit paradigm.

  • Shell passthrough - Basically like :! <command> in vim

  • Native Windows version - What it says on the tin - a version that can work with Windows (PS/CMD) natively without needing WSL

  • Daemon/server mode - A client/server/headless mode similar to emacs --daemon / emacsclient where the application is running in the background as a service (running background sync without the need for a cron job as well as the data API service) and one can simply start a joplin "frontend client" to avoid startup time on lower spec computers. Is there any possibility that such a thing could allow multiple clients access to a single Joplin instance (i.e. connecting a desktop client + a terminal client to the same profile without risk of clashes?)

  • Non-node/npm distribution - Would be nice if this could be provided as a self contained binary with its dependencies included without needing node/npm.

5 Likes

These all sound like reasonable improvement ideas and the whole post could be a starting point if someone wants to start working on the CLI app. Feel free to add some of them as GitHub issues and label them with "enhancement" so that we can keep track of them - maybe some could be labelled as "Good First Issue" too.

1 Like

I've created a bunch of enhancements, let me know (or feel free to edit) if the wording is unclear or incorrect etc. I've also added a couple of good first issues again feel free to add or remove that tag to any of them.
I've tried not to go too overboard and list all of them, just the ones that seem the most realistic to me for people who may wish to contribute.

I've also linked to those issues below each entry on the main post.