Initial Thoughts On A New Productivity Tool
As with most software projects, my new journey is about scratching a specific itch that I have had for a while. There is some friction in how I use my current productivity tools that I think I can solve with a reasonable amount of effort and if it is actually useful, I can see it being extended in some interesting ways.
I have a long term plan for this side project that I want to talk about and document, and I am hoping that having a place to write about it with minimal friction will keep me motivated to write about challenges and lessons learned during this journey.
What?
A spreadsheet based productivity tool built in Common Lisp with support for rich text, inline drawings, and the ability to evaluate code in a cell.
If my design works out as I imagine it will, this could be a way to build small apps that are essentially reactive spreadsheets, data visualizations, and dashboards.
Why?
A lot of my personal notes and thinking is done in Emacs’ org-mode. These tools have served me well and are the inspiration for my project. The main complaint I have with Emacs+org-mode is the graphical feature set. If I could simply embed a canvas widget in an org-mode document, I would be significantly less motivated to work on my project to be honest.
Other tools can do drawings embedded in notes, but org-mode is more than just a Markdown alternative. Some of the most important features for me are:
Project management, and todo list.
Executable code-blocks like a Jupyter notebook via org-babel.
Complex queries based on tags, dates, or keywords
Simple storage format that is offline and VCS friendly.
This combination of features could be replicated by combining different tools but I have come to highly value having all this available in one simple interface and being able to extend functionality using Emacs Lisp. If you have never heard of this tool, take a look at their website to learn more.
Tables in org-mode are a feature that I wish I could use more. I have tried to use it multiple times and resorted to just using Excel or Google Sheets because of how slow and clunky org-mode tables are for any useful amount of data. Spreadsheets being manipulated in text form is clunky even if the performance is improved so I am not optimistic about this feature ever being more useful to me.
Another obvious inspiration for this project is TreeSheets. It is very close to what I want in terms of user experience but I want the Emacs like ability to extend the tool and a Common Lisp based implementation makes that easier.
A less obvious inspiration for this project is Glamorous Toolkit. Pharo/Smalltalk just is not for me and I much prefer the Common Lisp way for writing and organizing code. Having a GUI that I can easily build on with Common Lisp is very appealing though.
How?
My pre-production work has been to figure out the tech stack for this. I am not interested in maintaining a large stack myself and I have no idea if this tool will ever be good enough for others to invest time in, so here is what I am building on top of for now:
Godot 4
It is a lightweight game engine with a decent UI framework. A game engine is familiar tech for me and will simplify packaging and deploying the tool.Embedabble Common Lisp
ECL is designed for use cases like this. I need a Common Lisp implementation I can easily integrate into a C++ code base with reasonable performance. I did try using sbcl-librarian but ran into issues that I was not interested in resolving. I may revisit this some time in the future as I do not intend to write any non-portable code.
Godot supports the notion of “servers”. My plan is to implement a LispServer that spawns a Lisp environment, pushes input events to lisp, and talks to the renderer.
Next Steps
I want to document basic interactions in this tool before I start working on a vertical slice. I do not want to open source this before I have a project I can build and maintain easily so that is some time away. Stay tuned if you are interested in the tool or just how building software with Common Lisp goes.