zx's Avatar

zx

@zxch3n.com.bsky.social

Founder of @Loro.dev https://github.com/zxch3n

684 Followers  |  202 Following  |  68 Posts  |  Joined: 03.12.2023  |  2.2887

Latest posts by zxch3n.com on Bluesky

Preview
Loro โ€“ Reimagine state management with CRDTs โ€“ Loro Loro - Reimagine state management with CRDTs | Built for local-first software.

loro.dev

14.05.2025 11:56 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Video thumbnail

Loro Inspector is here! Now you can directly browse the current state and complete edit history of your Loro documents in the browser. You can also use this tool to time travel to any version in the history of your Loro document.

30.04.2025 07:28 โ€” ๐Ÿ‘ 19    ๐Ÿ” 4    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Code screenshot:

// First we define our components

const Name = defComponent(
  // Components should all have globally unique identifiers.
  "01JNVY76XPH6Q5AVA385HP04G7",
  // Components are defined in terms of a Loro type
  LoroMap<{ first: string; last?: string }>,
  // We pass a function to initialize the component state to match it's type.
  (map) => map.set("first", "unnamed")
);

// Let's make age a counter
const Age = defComponent("01JNVYC0T0V6SDKDWQP51MYKS1", LoroCounter, (age) =>
  age.increment(1)
);

// Now we can create our entity, which is internally a Loro document.
const ent = new Entity();

// We can check which components an entity has
ent.has(Name); // false

// We can get a component, initializing it if it doesn't exist.
const name = ent.getOrInit(Name);

// We get then get fields on the component
name.get("first"); // unnamed
// And set them too!
name.set("last", "person");

// Happy birthday ๐Ÿฅณ ๐ŸŽ‚
ent.getOrInit(Age).increment(1);

Code screenshot: // First we define our components const Name = defComponent( // Components should all have globally unique identifiers. "01JNVY76XPH6Q5AVA385HP04G7", // Components are defined in terms of a Loro type LoroMap<{ first: string; last?: string }>, // We pass a function to initialize the component state to match it's type. (map) => map.set("first", "unnamed") ); // Let's make age a counter const Age = defComponent("01JNVYC0T0V6SDKDWQP51MYKS1", LoroCounter, (age) => age.increment(1) ); // Now we can create our entity, which is internally a Loro document. const ent = new Entity(); // We can check which components an entity has ent.has(Name); // false // We can get a component, initializing it if it doesn't exist. const name = ent.getOrInit(Name); // We get then get fields on the component name.get("first"); // unnamed // And set them too! name.set("last", "person"); // Happy birthday ๐Ÿฅณ ๐ŸŽ‚ ent.getOrInit(Age).increment(1);

Just implemented the first working attempt at an Entity-Component API on top of the @loro.dev CRDT.

It's a super work-in-progress start to the new Leaf SDK that will be powering @roomy.chat and a.weird.one.

08.03.2025 22:54 โ€” ๐Ÿ‘ 42    ๐Ÿ” 7    ๐Ÿ’ฌ 3    ๐Ÿ“Œ 1
Post image

Personal software has been trending recently.

I enjoyed reading @leerob.com's "personal software" and @edmarferreira.bsky.social 's "selfish software". Hope you enjoy them too!

xuanwo.io/links/2025/0...

07.02.2025 04:25 โ€” ๐Ÿ‘ 21    ๐Ÿ” 4    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0
Preview
Loro Is Local-First State With CRDT This lib has some big promises. Let's dive in! Wait, is it written in Rust? https://github.com/loro-dev/lorogoing inhttps://github.com/jbolda/local-first#liv...

Diving into Loro on stream today. Local-first, CRDT library written in Rust. Excited to explore it deeper! Starting in one hour.

28.01.2025 15:30 โ€” ๐Ÿ‘ 8    ๐Ÿ” 1    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

It's so hard to feel this warmth from interactions on social platforms these days ๐Ÿฅน

16.01.2025 18:25 โ€” ๐Ÿ‘ 3    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Post image

The animated gifs and illustrations in @loro.dev's docs are delightful. Finding these docs to be an enjoyable and readily comprehensible introduction to CRDTs. Thanks @zxch3n.com!

14.01.2025 21:55 โ€” ๐Ÿ‘ 10    ๐Ÿ” 1    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Post image Post image

New version control primitives have been added to Loro:
- diff(from, to): calculate the differences between any two versions
- revertTo(version): Generate ops to revert to the target version
- applyDiff(diff): Apply differences

You can use them to implement functions like git squash and revert.

09.01.2025 08:48 โ€” ๐Ÿ‘ 14    ๐Ÿ” 3    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Joseph Gentle

04.01.2025 10:46 โ€” ๐Ÿ‘ 4    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Preview
GitHub - tidalcycles/Tidal: Pattern language Pattern language. Contribute to tidalcycles/Tidal development by creating an account on GitHub.

They were using github.com/tidalcycles/...

12.12.2024 17:35 โ€” ๐Ÿ‘ 5    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Post image Post image Post image Post image

just watched DJs coding Haskell live?!

12.12.2024 17:25 โ€” ๐Ÿ‘ 18    ๐Ÿ” 1    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 1
Post image

83 GB

02.12.2024 11:53 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
diagram showing how two phones will use a new app called "skyroh" to talk to each other over p2p communications channels, and the regular bluesky API

diagram showing how two phones will use a new app called "skyroh" to talk to each other over p2p communications channels, and the regular bluesky API

Ok, a rundown of how we get p2p ATProtocol going:

1. Run *standard* ATProto services, locally
2. Use p2p to holepunch TCP connections
3. Add a thin layer for peering management

Bundle all that up in an app, and we have a recipe for adding resilience & scaling to Bluesky. ๐Ÿงต teim:

29.11.2024 19:06 โ€” ๐Ÿ‘ 125    ๐Ÿ” 31    ๐Ÿ’ฌ 8    ๐Ÿ“Œ 10

No, they are expected to be deleted

30.11.2024 00:51 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Sounds like a binding error

28.11.2024 10:32 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

@loro.dev is also worth a try!

28.11.2024 10:31 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

They can stick with the old version

28.11.2024 09:00 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

They have to provide the best timeline with an acceptable privacy policy (though it sounds hard). Otherwise, consumers may leave, putting them in a very different position than previous products. If this becomes a trend, I wouldn't be surprised if people call it the next generation of the Web.

27.11.2024 17:53 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

From another perspective, we can also think that their design forces them to compete more fairly for advertising business with other app views or recommendation streams without the network effect advantage.

27.11.2024 17:53 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Thanks for the elaboration!

27.11.2024 16:31 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

bisecting issues is much easier in a linear history

27.11.2024 13:57 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 1
Post image

Was listening to *City of Stars* and saw this ๐Ÿ˜ญ

27.11.2024 10:02 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Yeah, I'd like to build upon that

27.11.2024 08:46 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Once ATProtocol has formed network effects and is sustainable, future companies can explore more ethical business models in this decentralized ecosystem.

27.11.2024 03:57 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Although I am excited about the next generation of the web, such things have never been accomplished by a single company alone. I hope that Bluesky can take a pragmatic approach (rather than pursuing innovation in everything) and prioritize the sustainability of the ATProtocol ecosystem.

27.11.2024 03:57 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0

I also look forward to seeing different business models or using user devices to provide computing power to reduce marginal costs. But if Bluesky has to make another bet on a different business model for reasons like "ethical" considerations, the chances of failure would be too great.

27.11.2024 03:57 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Bluesky has already made a significant bet on ATProtocol and may have exhausted its innovation budget. It's unrealistic and unfair to require a company to build everything in an innovative and "ethical" way.

27.11.2024 03:57 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

The slides for the talk are available here: loro-slidev.vercel.app

26.11.2024 19:05 โ€” ๐Ÿ‘ 12    ๐Ÿ” 4    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

I don't see it that way. Google also profits from ads, but I consider it a great product. Companies can choose how 'evil' they want to be. And if Bluesky can make ATProtocol popular and sustainable, that's already a great achievement.

26.11.2024 11:55 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

It's also rather simplistic to categorize the evolution of the Web into different generations merely based on broad business model classifications

26.11.2024 11:44 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

@zxch3n.com is following 20 prominent accounts