Reflection Winter Update

By Tobias, Andreas, and Julian

One of our goals for the Prototypefund project period was to blog more, but for various reasons that didn't quite work out as intended. We gave a lot of talks at in-person events (GUADEC, OpenAlt, Boiling The Ocean, etc.), but never quite managed to write them up in blog form. So for those following along at home, here's a winter update on the state of Reflection!

Background

Reflection is a native GTK collaborative note-taking app built on p2panda. The idea for this project comes from the GNOME + p2panda workshops we've had in Berlin since late 2023, and became concrete with a focused weekend sprint in December 2024. During this sprint we put together a first, hacky proof of concept for what would become Reflection. In December we also submitted a Prototypefund application, which is the grant under which we're currently working on this project. In the spring of 2025 Julian worked on cleaning up and expanding the proof of concept app as small part of a prevoious p2panda NLNet grant. From June onwards, as part of the Prototypefund grant we've been focused on getting Reflection out of the science experiment stage and towards something daily-drivable.

Network Rework

The biggest thing that happened since the summer is that we realized that the networking issues we encountered in early testing were more severe than we thought. We decided to fix this once and for all by expediting a planned rework of the p2panda-net crate. This was a risk, because it meant a delay in the initial release of the app, but it seemed better than trying to paper over the cracks short-term.

Luckily this paid off, and the p2panda team was able to complete this rework. It's not yet merged into upstream p2panda-net, but we're already using this new version in Reflection and it solves most of the networking issues we had.

Text editor window with text area and headerbar, and a connection popover in the top right. The connection popover has an offline/network swtich, and a list of four peers.
The current state of Reflection

In the mean time, we continued to expand the app UI, with a new layout and navigation model for the app, user avatars for active peers in the headerbar, document deletion, spell check, multi-window, and many bug fixes and refinements.

Design & Research

While the primary focus for the past months was getting the basics to work reliably, we also had lots of design and planning discussions about longer-term questions. Local-first is still a new field, with lots of open reserach questions nobody has a clear answer to yet. We explored some of these questions in the context of Reflection, and made mockups for how they could work in theory.

Side by side view with current document and older versions of the document, with a timeline on the right hand side of the window.
Experimental mockups for version control

This includes things like file deletion UX in a peer-to-peer context, how to maximize IP address privacy, how to do version control, and how to handle user identities in a way that can't be easily impersonated.

We'll write about this in more detail in future blog posts.

Preview Release

We're now finally ready to release a first preview version of the app. This initial version has all the major features we wanted to do as part of Prototypefund, with the exception of access controls and end-to-end encryption. We'll integrate these in the new year, since the networking rework was not part of our original time plan.

Network popovers with the offline/network toggle and list of peers. One of the shows the admin view, which also has a list of pending Join Requests, and settings to promote/demote peers.
Mockups for access controls in Reflection

The introduction of access controls and end-to-end encryption is going to be a pretty big change for the app, going from "anyone can join if they have the link" to "manual approval by admins". We can't promise at this stage that it will be possible to bring all existing documents over to that new version when the time comes, but we plan to provide at least a way to export all documents before then.

This uncertainty is why we're going with Flathub Beta for this preview release, rather than Flathub proper.

Install

You can get the Reflection preview release from Flathub Beta now.

Add the Flatpak Beta remote on your system:

flatpak remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo

Install the app:

flatpak install flathub-beta cx.modal.Reflection

Testing Testing Testing

With this release we hope to get a lot more people testing the app. Peer-to-peer networking is not easy to get to work reliably, in part because there are so many things that can go wrong at different layers. It's not easy to artificially recreate every networking edge case during development.

This is where you come in! You can help us make the app more robust by trying it on your specific network setup, and filing bugs if something breaks. In the real-world testing we've done so far we've already found some fun cases (hello eduroam!), but we expect there to be a lot more.

When filing bugs it may be helpful run the app with logging enabled so you can include logs in your issue report:

RUST_LOG=p2panda_net_next=debug flatpak run cx.modal.Reflection

What's Next

We now have a few more months of funding as part of the Prototypefund project, with a focus on making the project more sustainable long-term. To this end we want to stabilize the app and make a real 1.0 release, port to other platforms (e.g. macOS), do user research and adapt the app accordingly, release the GObject bindings, and organize more community events, among other things.

Most of the Modal team will also be at CCC this week and FOSDEM end of January, where we'll be giving a talk in the Local-First devroom. See you there!