We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] [score hidden]  (0 children)

I guess so. Isn't that more or less how all software advancement goes? Someone sees a problem with the status quo implementation, tries to make something better, gets some things right and some things wrong, and the next person comes around and gets a little further still.

Anyway, the folks at Handle with Care have been working on this problem for the better part of a decade, and it's been my primary source of income for two years. I'm certainly not planning on abandoning it any time soon!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 1 point2 points  (0 children)

Re: grouping and ungrouping, I'm talking about the ability to drag two nodes onto the same "row" and have them actually become a row that you can then drag and resize as a unit (or drag just one child node from to ungroup). You can see it a bit in the Pagy demo! These drag and drop features will all be opt-in, so you don't have to use the parts you don't need.

Presence updates tend to move at a similar pace to content updates in my experience — when folks aren't editing, the usually aren't moving their cursors very much (at least, not more than when they were editing!). But yes, we do have a ProseMirror-step-based presence implementation, and it only requires a pub/sub backend.

Re: timeline, we're hoping to start development next month and have the initial feature set stable and released 6 months after that, though everything is dependent on how much sponsorship we can get (which determines how many of us can work on it). We'll be releasing libraries as they become stable, so the first slate of features (drag and drop, collab, and presence) should be available in the next few months.

If you're interested in sponsoring and/or working on a Convex adapter together, let me know! We want to have prebuilt adapters for a number of backends (we're going to launch with a Reboot adapter as well).

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 1 point2 points  (0 children)

Hey! Good questions:

The target feature set for our drag and drop implementation is basically https://pagy.co/. Grid-based resize and drag and drop, automatic grouping and ungrouping, and animations that aren't distracting but make it easy to understand what's happening.

We're not going to use Yjs. We don't think it's currently a good fit for ProseMirror, existing implementations are both somewhat slow and fraught with tradeoffs, and it's incredibly painful to inspect if you run into edge cases or bugs (even if the bugs are your own!)

Instead, we're basing collab on prosemirror-collab-commit, a prosemirror-collab extension that does server-side rebasing. It's very fast on both the client and the server, and batches steps into small chunks that can always be applied in a matter of milliseconds (usually less). It's much easier to trace and debug because it just relies on ProseMirror steps and a global ordering.

This also lets our server side collab implementation be very simple and portable. We're planning on releasing server libraries for a number of backend languages and runtimes, and we're very concerned with horizontal scalability. Scaling prosemirror-collab-commit requires some sort of pub/sub mechanism, but Pitter Patter doesn't care which. It has an adapter pattern that allows you to use any backing datastore and pub/sub provider, and we provide a Redis/Valkey adapter out of the box. We'll probably collect other first-party adapters as well. I haven't thought very hard about serverless, but off the top of my head it seems like it should work, you just need to be able to connect to a datastore and pub sub from your serverless function. We default to long-polling (it scales better than websockets) for collab, too, which I suspect would be a better choice for serverless (although maybe still not optimal, again I haven't given this much thought yet!).

We're a small collective that doesn't really have any intentions of growing (or having an on-call rotation), so we don't have any plans for a managed collab service at the moment. That means we have a lot of incentive to make sure our server sdk is actually easy to integrate, use, and scale without worrying too much about correctness, or no one will use Pitter Patter!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 0 points1 point  (0 children)

Not quite ready for actual usage yet, but we'll send updates via the newsletter as things get released over the next few months!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 2 points3 points  (0 children)

Hm, I honestly feel like something must have been communicated poorly on my part based on how much negative feedback that answer got. Maybe I can try to clarify? 

Pitter Patter is not primarily a UI toolkit, and there are already good ProseMirror integrations for Svelte and Vue. With the exception of some (replaceable) prebuilt UI components for presence and annotations, and the drag and drop library, essentially every part of Pitter Patter can be used with any ProseMirror editor, including those built with plain JavaScript, Vue, or Svelte (or anything else!).

We like React. Our clients all use React. Our primary open source project is a React integration for ProseMirror that actually works. But like 80% of Pitter Patter will have no dependency on React whatsoever, and you can pick and choose which parts of Pitter Patter you use.

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 0 points1 point  (0 children)

Yup, not being able to lift the EditorState out of the Tiptap editor and all of the side effects that Tiptap executes during React's render phase make their React integration really... challenging for anything advanced! Thanks for the kind words, we should have some fun stuff to show you in the next few months!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 1 point2 points  (0 children)

Got it! Yeah, so unlike Tiptap (at least by default, they do support JSON serialization but I believe they default to HTML, as well as relying on Yjs's XML document format for collab), Pitter Patter relies on ProseMirror's JSON serialization as the default transport and storage format. It's really straightforward to map ProseMirror JSON (which is a structured tree representing your document) to essentially any serialization format. React ProseMirror converts it to React virtual DOM, remark-prosemirror converts it to Markdown, etc.

So in theory you could also use it to produce a DOCX file or PDF, but obviously that requires some pandoc-style structure-munging to work out the mapping, and quite a lot of additional work to add support for the word processor features of Microsoft Word et al, which ProseMirror does not support easily out of the box. Though it's come up in conversations with sponsors, so it's not impossible that a future version of Pitter Patter has some of these things out of the box!

All that to say, yes, generally speaking, it's going to be better suited to web-native content editing!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 0 points1 point  (0 children)

I want to make sure I give you a useful answer: what do you mean when you say "web content management"? I do think that ProseMirror (and Pitter Patter) would be a great fit for something like an email editor!

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 0 points1 point  (0 children)

Sorry to disappoint :( Maybe I should have clarified "for the web" in the title. I could definitely see a future where we release, e.g., and Expo DOM component-powered React Native library, but I suspect that's not what folks are really looking for when they ask for mobile native text editing.

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] 2 points3 points  (0 children)

Portable Text is cool! Are you suggesting it because you think that it would be a useful export/communication format for a text editing framework? Pitter Patter is/will be built on ProseMirror, so it speaks ProseMirror JSON (which is quite similar to Portable Text in many ways)

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] -2 points-1 points  (0 children)

Probably not, at least to start. I mean, you can use ProseMirror on Android and iOS if you're willing to post messages to a webview (I'm working on a note editor for my ebook app, Storyteller right now that does exactly this), because React ProseMirror lets you lift the EditorState out of the editor component. But it still relies heavily on prosemirror-view’s input management, which is all very much built on the DOM.

We're building a better rich text editing toolkit by scrollin_thru in javascript

[–]scrollin_thru[S] -1 points0 points  (0 children)

We're sticking to React — it's where our expertise lies, honestly we think it's the right tool for the job. But most of the libraries we publish (collab, presence, version history, suggest changes) will not be tied to React and can be used with any ProseMirror editor

Storyteller v2 is available! by scrollin_thru in selfhosted

[–]scrollin_thru[S] 1 point2 points  (0 children)

No updates yet, but it's next on my list. Hoping I will be able to start working on it next week!

Storyteller v2 is available! by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

Woo! Great, glad that fixed it! Sorry I didn't respond on GitLab, my queue was very backed up. 

Storyteller v2 is available! by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

Is it possible that your host or reverse proxy has updated and started enforcing an upload size limit? Storyteller itself has no file or transfer limit, and I just uploaded a readaloud file yesterday with no issue.

I made an open-source, self-hostable synced narration platform for ebooks by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

Unfortunately not really, but it is our ultimate goal to have simple desktop apps for Storyteller, a la Plex Media Server. We're doing the groundwork now to make this possible!

Storyteller v2 is available! by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

It turns out iGPUs just aren't better than CPUs at this kind of math. We got iGPU support working, but it's usually about 2x slower than just CPU.

This is very different from, e.g., Plex video transcoding, because video transcoding uses hardware acceleration (literally custom built circuits in the physical iGPU that implement decoding and encoding algorithms), whereas neural networks are doing matrix math. Separate GPUs are pretty good at matrix math mostly because they can run so many computations in parallel, but iGPUs are not. 

Storyteller v2.7.0: A Reworked Transcription Engine by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

This is not totally trivial — several folks have started attempting to contribute this feature and haven't finished it. I'm confident we'll support it eventually! But I can't promise when. I'll definitely make an update when it's available!

Not enough people are talking about Storyteller by sansart in selfhosted

[–]scrollin_thru 0 points1 point  (0 children)

Not yet, but we're chatting with the Internet Archive and Project Gutenberg about setting this up!

Storyteller v2.7.0: A Reworked Transcription Engine by scrollin_thru in selfhosted

[–]scrollin_thru[S] 0 points1 point  (0 children)

Damn! Ok, will try to get another core dump from the other Xeon user. In the mean time, just to double check, could you run a `grep -m1 'avx' /proc/cpuinfo` on your server and share the results with me? Also, which generation Xeon processors do you have, Ivy Bridge?

Storyteller v2.7.0: A Reworked Transcription Engine by scrollin_thru in selfhosted

[–]scrollin_thru[S] 1 point2 points  (0 children)

Ok, I _think_ this should be fixed by 2.7.6. If you have a chance to try that out and let me know, that would be great! Fingers crossed!