Julian Sparber

@jsparber
780 Followers
126 Following
364 Posts
Developer, tinkerer, hacker at heart
Websitehttps://juliansparber.com
Bloghttps://blogs.gnome.org/jsparber/

Reflection is now actually local-first, and almost the entire code base doesn't care whether you have network, or whether your device can't establish a connection to other devices via p2panda.

Still not merged nor fully polished but we are getting there :)

This Wednesday (September 10th, noon UTC), we're having a virtual meetup / awards ceremony for our Summer of GNOME OS competition!

We'll announce the winners of the Oneplus 6 and our exciting limited-edition shirts (thanks @ondrejkolin for helping with logistics), talk about how it went for everyone, and the future of GNOME OS more generally.

Join us here: https://meet.gnome.org/rooms/roy-7mn-1z3-7er/join

The October edition of #BoilingTheOcean is coming together nicely! We have a venue confirmed (@101lab thanks to @ben4climate!), @ondrejkolin is printing shirts (watch out for preorders soon!), and on Saturday we'll have a DJ set by @jimmac 🪩🌈

You can now sign up by adding your name, and propose sessions and lightning talks here: https://pad.gnome.org/1EIXiLe8Ri2St_ayB8uRHg

After my term at the GNOME Board of directors was finished last month, I finally managed to write a public retrospective: https://blogs.gnome.org/pabloyoyoista/2025/08/25/retrospective-of-my-term-as-a-director-for-the-gnome-foundation/ Hope some people find it useful. It was not easy to write, but I think it is something necessary.
Retrospective of my term as a Director for the GNOME Foundation

On the spring 2024 I presented my candidature, and eventually got elected for the Board of Directors at the GNOME Foundation. Directors are elected democratically by the GNOME Foundation members, and positions are usually up for election every 2 years. However, when I started my term there was one position open for a single year...

GNOME adventures in mobile

Yes, #GUADEC2025 is over. We want to thanks all the in person and remote attendees, the volunteers, the staff and all those made this edition possible! 👏

The initial report is:
- 450 espresso coffee
- ~5kg of sweet pastries
- ~5kg of savory pastries

Looking forward to see you again next year!

P.S. photo album will be published as soon as possible on Flickr

And now it's merged in main. 😁
We have a working draft MR to add multi-cursor support in Reflection(former Aardvark), a proof of concept local-first text editor that uses p2panda for GNOME.

Fuck yeah, the very annoying issue that screenshot notifications were not grouped in GNOME Shell is now fixed 🙌

Huge kudos to @jsparber and @fmuellner!

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3210

screencapture: Reuse same notification source if it exists already (!3210) · Merge requests · GNOME / gnome-shell · GitLab

We want notifications to be grouped by source but in order to have grouping (for now only on the lockscreen) we need actually to use the same source...

GitLab

New blog post about our local-first GNOME app initiative! Project Aardvark is growing up into a real app, called Reflection 🪩✨

Over the coming months we have a @PrototypeFund grant to expand the app into a proper local-first Hedgedoc replacement, with multi-cursor, sharing URLs, undo, permissions, and more.

Hopefully the first of many GTK+p2panda apps to come, especially once we add GObject bindings making this stack accessible to non-Rust apps :)

https://blogs.gnome.org/tbernard/2025/06/30/aardvark-summer-2025-update

Yesterday the "Reflection" project started officially as part of the new @PrototypeFund round! 🌟🌈

The team consists of @p2panda and people from the GNOME gang around @tbernard and @jsparber.

We gonna release "Reflection" (formerly Aardvark) - a GTK-based, collaborative, local-first text editor! Aaaand:

All of this is part of a larger effort to explore p2p code, UX patterns, reusable UI components, debugging tools, organize events and document our learnings.

#p2p #p2panda #localfirst #gtk

×

New blog post about our local-first GNOME app initiative! Project Aardvark is growing up into a real app, called Reflection 🪩✨

Over the coming months we have a @PrototypeFund grant to expand the app into a proper local-first Hedgedoc replacement, with multi-cursor, sharing URLs, undo, permissions, and more.

Hopefully the first of many GTK+p2panda apps to come, especially once we add GObject bindings making this stack accessible to non-Rust apps :)

https://blogs.gnome.org/tbernard/2025/06/30/aardvark-summer-2025-update

@tbernard @PrototypeFund
The use case of peer to peer sync that I'm really curious about would be something like a private notes or tasks app, playback positions and listened episodes in a podcast app, stuff like that.

I'd be great if I could sync stuff like that between a phone and a desktop and not have to have a account at some syncing service or selfhost something.

@pethil oh, my god, yes.
@tbernard @PrototypeFund Exciting news and a great potential! With The Document Foundation working on ODF 1.4 standard which will allow collaborative workflow in LibreOffice, I'm silently wishing for GNOME Office to come to life with adaptive interface and local-first ideas some bright day.

@tbernard @PrototypeFund

I still do not understand what is meant with 'local-first'. Is there somewhere a good definition?

I guess you use peer to peer technology to sync the data? But how do you do that if both devices are not online at the same time? You just wait when they are?

@Scott_Trakker @tbernard @PrototypeFund Generally, on the high level, a local-first app works as follows. Each peer changes its local version of data, which is usually represented as a CRDT. Once all the peers are online, they exchanged their states/sync messages and get to the same deterministic consistent state.

If interested in more detailed explanation, I'd recommend reading:
- https://www.inkandswitch.com/essay/local-first/
- https://jakelazaroff.com/words/an-interactive-intro-to-crdts/

Local-first software: You own your data, in spite of the cloud

A new generation of collaborative software that allows users to retain ownership of their data.

@3timeslazy @tbernard @PrototypeFund

Thanks for the links! I will dive into it!

@Scott_Trakker @tbernard @PrototypeFund Yes, and they use 'special' techniques to make sure conflicts don't happen (search for Conflict-free replicated datatypes - CRDTs)
(Whether semantic conflicts happen is another matter - if we both edit the same paragraph when offline, it might not be the result either of us had hoped for, but it will be consistently the same for us both)

Seems like https://lofi.so/directory has an interesting catalog of local-first apps.

Local-First Software

@Scott_Trakker “In cloud apps, the data on the server is treated as the primary […] copy of the data; if a client has a copy of the data, it is merely a cache that is subordinate to the server. […] In local-first applications we swap these roles: we treat the copy of the data on your local device […] as the primary copy. Servers still exist, but they hold secondary copies of your data in order to assist with access from multiple devices.”

https://www.inkandswitch.com/essay/local-first/

@tbernard @PrototypeFund

Local-first software: You own your data, in spite of the cloud

A new generation of collaborative software that allows users to retain ownership of their data.

In the same document: “Since local-first applications store the primary copy of their data in each device’s local filesystem, the user can read and write this data anytime, even while offline. It is then synchronized with other devices sometime later, when a network connection is available.“

How was this made possible? “We have found some technologies that appear to be promising foundations […] the family of distributed systems algorithms called Conflict-free Replicated Data Types (CRDTs).”

@tbernard @PrototypeFund That’s incredible! Everytime you were discussing local first here, I thought you were speaking of individually used digital services like cloud storage or password managers. I did not expect the 1st project to be a collaborative text editor. Can’t wait to see how that plays out.

On that note, I wish the GNOME Circle app "Secrets" had local-first sync abilities 👀 Maybe I can finally take on a lil FOSS challenge.

@tbernard would be kinda fun to add local multi-cursor

as in

multi-seat compostior → each wl_seat gets its own focus and cursor in the app :D

@tbernard @PrototypeFund You work on the coolest things!
@tbernard @PrototypeFund Impressive work! You guys are really pushing the world in the right direction!
@tbernard @PrototypeFund Will this allow for multiple keyboards and mice to be used on the same device simultaneously., and binded togother, so multiple apps can have focus?

@kitcatlove @tbernard @PrototypeFund No this aims more on "more sessions" simultaneously to exist next to each other and share the state.

Simple example Google docs without storing the docs in the central service.

@ondrejkolin @tbernard @PrototypeFund Will/can it be added to the timeline?

@kitcatlove @tbernard @PrototypeFund I think it is out of scope of this particular solution.

Check the https://p2panda.org/ website. ☺️

p2panda

Building blocks for peer-to-peer applications

@tbernard
Funny how we had gobby (and sobby) back in the mid 2000s, and then came etherpad and everyone switched to it because lol who wants to install apps, and now we’re back to a proper app with Reflection.
@afranke Never heard of those, tell me more!

@tbernard

https://gobby.github.io/

The g is for GTK, as everybody did back then.
sobby is a server only version. You could run sobby on a box that you didn’t turn off at night (e.g. a VPS) and people would connect to it from gobby, or you could start a server right from your own gobby. Later they spun off libinfinity so that other apps could use the same protocol and be collaborative (i.e. gedit could have added the feature). Not sure whether there were actual consumers of that lib.

Gobby

@afranke I guess what changed in the mean time is the issues with the web have become more and more apparent, there's been a ton of progress on CRDTs, and third party app distribution is finally viable with Flatpak :)
@tbernard I don’t think distribution plays a role here. The app was readily available in most distros.

@tbernard @afranke the big (maybe only) upside of having it in the web is that i can share notes to literally everybody, no matter if its a phone, a desktop, windows/macos/android.

and also "opening a link" is easier than "install this app" -> "open the link/enter pin/whatever"

i'll likely continue to use hedgedoc or whatever web-based, just so the one i'm sharing it with has as little as possible work to view/edit my docs.

@fossdd
The point is that the web should be a client like installed apps, not the mandatory interface.
@tbernard

@tbernard @PrototypeFund very cool work! Design question: when and how does it make sense to add this to existing apps?

For example: it would be cool to have collaboration in Papers to read and annotate lecture notes together in realtime. But maybe this use case is too specific for Papers itself and warrants a separate app? But in that case, it would be quite bad having to fork or reimplement the entire Papers just to add this collaboration feature on top?

@YaLTeR @tbernard @PrototypeFund maybe if papers had a plugin architecture...
@bugaevc @tbernard @PrototypeFund this kind of feature sounds like it should be too integrated into the main code (to work well and be polished) to be a plugin but idk

@YaLTeR Good question! I'd say at this stage of maturity it makes more sense to do this in individual third party apps where it's self-contained and can be iterated on easily - longer-term we do want something like a system-level sync API apps can just use, and at that point I'd imagine we would support it in many core apps as well.

Lots of open questions though, e.g. identity, threat models, where does data/metadata live, where do CRDTs live, how high/low level are the APIs, etc.

@YaLTeR For example, depending on the identity system the potential collaboration workflows would look very different.

e.g. could have fancy Nextcloud-style groups and shared folders for collaboration/permissions, or could keep it super simple, e.g. the pseudonymous identity thing in Reflection.

Also, for anything operating on user files we need to take into account edge cases like external apps changing it from under us etc.

@YaLTeR But if we figure all that out I could see there being a system service that handles all the networking, discovery etc. (managed via a quick settings menu?) and a client library that makes it easy to work with CRDTs and comes with the basic UI for displaying peers and sync status in apps.

Airdrop is probably an interesting example to look at in terms of UI and workflows.

@YaLTeR This is all just me speculating though, cc @adz @jsparber @AdrianVovk for technically more informed opinions :P