Skip to content

Legacy Version

As mentioned in the homepage, the original version of Stuck was an Electron app. The very first version was full webstack but it soon became a robust app where the webstack was only used for the UI implementation.

The one and only true reason I left that stack behind was the unavoidable typing latency introduced by ProseMirror. For Stuck, that was unnacceptable.

But there were other reasons as well that made that decision easier:

  • bloat: Electron an unavoidable amount of RAM bloat. It might not be a dealbreaker on its own, but it's definitely not insignificant, especially for an app about frictionlessness. Still, there would be ways to solve this without actually giving up on ProseMirror (Tauri being the most obvious one).
  • architecture: some of aspects of Stuck's architecture like contextual shortcuts were definitely fighting the currents of what webstack commonly pushes towards. It's not to say that it can't be done, or even that it can't be done well, but it's more laborious than in other stacks.
  • involvement: I don't actually have much experience with webstack neither do I want to. I left all of the coding to LLMs while I managed the design, architecture and decisions. But it's difficult because it requires some amount of trust that AIs can do what you ask them to if you're explicit enough and strict enough; and in my experience, you can't. So it created a bit of an uncomfortable feeling where it wasn't really my app because I wasn't entirely sure that the Electron was implemented in a way that worked for me.

It would be dishonest of me not to mention the things that I knowingly gave up on. What mattered in that decision though, was that I wasn't giving up on anything I couldn't manage to implement; I was giving up on the ease or integration of it.

  • accessibility: the DOM is very practical for accessibility. It doesn't require more than well-designed and carefully implemented software to work well with screen readers for intance. Avalonia, on the other hand, requires plugging it in manually.
  • chromium integrations: things like dictionaries also need to be integrated manually. And in general, chromium offers a lot of under-the-hood integration that would need to be remembered and integrated by hand in other frameworks.
  • rich text: this one is actually more of a lie it turns out. I thought i was giving up existing Rich Text handling but actually i wasn't. Avalonia itself has Rich Text handling but it's paid. However there are free community libraries for it. The thing is, those libraries tend to handle a great many deal of Rich Text (much more than Stuck needs), and in doing so introduce the kind of performance issues I'm specifically running from. Because Stuck requires extremely basic Rich Text only, the best is to take a Plain Text library and implement it myself. AvaloniaEdit allows exactly that.

The Last Version

When I realized the latency issue was there and irremediable, I was in the middle of refactoring a lot of the app for better safety, cleaner architecture, and easier accessibility integration (in this case: locales). I may or may not have let LLMs run wild on the web aspect of the stack and I may or may not have regretted it as I always do. I didn't let them anywhere near the Nim engine so that part was fine.

Independently from how dirty some aspect of the architecture was (I discovered that all states, no matter how permanent or ephemeral, had been written in a single file. I swear to god, wtf. ), the app was functional and actually made for a very decent prototype. A reasonable number of the features were implemented and the aesthetic was mostly settled.

Major features that weren't implemented were:

  • Manuscript Version (commit-versioning was implemented, but not draft versions--WOV basically didn't even begin to exist),
  • "Utterly Unrelated". I don't think it had even been designed at all, it was really just an idea jotted down.
  • Notes. I think I added the feature on the list not long before I decided to start over.
  • Aliases

There were also a lot of still-open: some bugs, some features and a lot of UI/UX nitpicking on my part. If you want to laugh, here is a page of notes I was taking inside Stuck about Stuck as I was working on it.

As for important features that were implemented:

  • Import/Export + PDF Export live preview
  • Writing Space configuration
  • Themes
  • Keyboard Shortcuts (I'd redesigned them and hadn't fully implemented the new version though)
  • Autosave + Commits + History (not sorted or categorised)
  • Remote + Markdown export for portable readable version
  • Stand-Ins
  • Set Aside (chapters + outtakes)
  • Dictionaries + Personal Vocabulary
  • Chapter splitting & automatic numbering/renaming
  • Cursor persistence (retaining cursor offsets across chapters in-session, or restoring the last page/cursor on boot)
  • Special character shortcuts (like auto em-dashes)
  • Word count metrics

Screenshots

Writing Space - Bare Writing Space - White Writing Space - Contents and formatting Writing Space - formatting Book page Bookshelf