# Epic COMMS-502 - Using BlockNote without Hocospocus

Project: Stream Communicator
Status: on hold
URL: https://community.openproject.org/work_packages/COMMS-502

## Detailed specification

### Motivation and background information

Admins are our friends. We should not force them to switch their way of running OpenProject. They need to have some ramp up time. Our current idea of running Hocuspocus requires a Docker based setup, e.g. with Kubernetes. And not everybody will be ready to go that route. That could lead to admins to not being able to update OpenProject, and that is not ideal as security updates don't get in anymore.

### Acceptance criteria

  - In admin settings there is a global setting "Real time text collaboration" *on/off*. That is actually independent of the fact if there is a Hocuspocus server successfully set up or not.

  - When the setting is *on* BlockNote can expect Hocuspocus to be set up completely. If something is broken, it should throw errors. It does not fall back gracefully to the following case:

  - When that setting is *off*:
    
      - BlockNote based documents can be created and edited
    
      - \[Note: This one was heavily questioned by @parimal. He argues that this tries to be some sort of small real-time editing but failing all the cues that a user needs. Users would not understand where changes, that they save are coming from if there are no live cursors for example\] Editing conflicts (race conditions) get resolved (on client side and not on server side)
        
          - When starting to edit a document, the document has a last modified timestamp
        
          - On saving a document the client tries to send the document to the back end and also provides the last modified timestamp
        
          - If on the server side the **last modified** time stamp match, it means that it is safe to save the document
        
          - If they don't match, the client loads the latest state from the server (and remembers the new **last modified** date) and merges it with the local document. It also informs the user that there were changes upstream and they are getting merged.
        
          - If the user chooses to press "Save" again, then the merged document get pushed with the **last modified** timestamp.
        
          - The server might or might not accept the document, based on the **last modified** timestamp
            
            <br>

### Out of scope

| Attribute | Value |
| --- | --- |
| Mockups |  |

## Planning

| Attribute | Value |
| --- | --- |
| Roadmap |  |
| Date |  |
| Votes |  |
| List |  |
| Target versions | Product Backlog |
| Sprint |  |
| Backlog bucket | BlockNote and friends |
| Relevance |  |

## Subitems

_No work packages_

## Bugs and other work packages

_No work packages_

## Details

| Attribute | Value |
| --- | --- |
| Module | Modules and project features / Documents, Modules and project features / Text editor / BlockNoteJS |
| Enterprise plan |  |
| Labels |  |

## People

| Attribute | Value |
| --- | --- |
| Assignee |  |
| Accountable |  |
| Product manager |  |
| Designer |  |
| Developers |  |
| Requested by |  |
| Interest by |  |

## Estimates and progress

| Attribute | Value |
| --- | --- |
| Work |  |

## Description

## Problem

There are multiple possible reasons why not everybody can install Hocuspocus just like that in their infrastructure:

  - Firewalls might block websockets

  - Server admin might be able/capable to install a Kubernetes/Helm based setup just yet and are stuck to packaged installations without Docker

## Pain

  - OpenProject features that require Hocuspocus will not work, e.g. Documents. Eventually that will expand to work package descriptions, too.

## Messaging

*If you were to write a press release, how would you describe the value to customers?*

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><tbody><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Headline</p></th><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">First Paragraph</p></th><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p">Customer Quote</p></th><td class="op-uc-table--cell"><p class="op-uc-p"><br data-cke-filler="true"></p></td></tr></tbody></table></figure>

## Go to market

*How are you planning on getting this into users' hands?*
