Zero Data Swap #2: Files / Portability — September 29, 2021

See also the previous swap.


Reading Inspiration

With one-off API integrations, every app must be connected with every other app in both directions. The number of integrations required for interoperability is equal to the maximal number of edges in a directed graph, or n * (n-1). Adding one more app, for a total of 6, means going from 20 to 30 integrations. 10 apps is 90 integrations! […] Imagine any of these apps needs to change its API. Now every single other app in the network needs to change its integration code. Everyone in the network has to coordinate, because everyone in the network has to implement everything.

The protocol acts as a hub in the network, cutting the number of connections necessary for full interoperability from n * (n - 1), to just n. The number of integrations scales 1:1 with the number of apps. […] none of these apps have to know anything about each other. All they need to know is the protocol. This makes the set of possible workflows between apps an open set. […] Files make interoperability the default […] Files allow interoperability to emerge retroactively. New apps can come along and implement the file formats of other popular apps, uplifting their file format into a de facto protocol. This has happened many times, from .doc, to .rtf, to .psd. Competing products are able to get off the ground by interoperating with incumbents. New workflows can be created permissionlessly.

Protocols produce creative combinatorial explosions […] When you have a universal API for composition each additional tool increases the number of possible workflow combinations by n * (n - 1). […] That’s our directional graph equation again, but this time the network effect is on our side. The more tools, the more possibilities. […] If a tool supports composition with other tools, it supports open-ended evolution. At that point, all of the other ways in which it might be terrible become incidental, because an evolutionary system will always be more expressive than one that isn’t. Nothing else can widen the potential of creative tools as rapidly as composability with other tools. It’s not even close.

The power of files comes from them being powerful nouns. They are temporary holding blocks that are used as a form of exchange between applications. A range of apps can edit a single file in a single location. On mobile, the primary way to really use files is to “Share” between apps. This demotes files from a powerful abstract noun into a lackluster narrow verb. […] For example, I can import a text file into the Notes app but it’s really nothing more than a glorified copy/paste, not an editing of an object in place. This makes a cloud storage service like DropBox nearly useless as I’m not editing “the thing” but a copy of the thing. I need to save it back out to Dropbox if I want anyone else to see my changes. That’s vastly underutilizing the power of the abstraction that comes from files.

This isn’t some feeble political statement to liberate my data from a company. I want files to liberate my data from my own apps and create an ML explosion of activity! Files are at some level a hack, I get that, there are limits but they are an extremely useful and flexible hack. Like the QWERTY keyboard, they are “good enough” for most tasks. Files encapsulate a ‘chunk’ of your work and allow that chunk to be seen, moved, acted on, and accessed by multiple people and more importantly external 3rd party processes.

What if you could move data items, with views provided by their hosting applications, around system and application views? What if we could bring together a series of things that all relate, even if they are of different types, and are from different apps or windows? What if you could browse your things in one fluid interface, without regard for their differing data types?

When you pull an item into some other place, it is still rendered by its hosting application. Hosting applications provide the view components for rendering data items in different situations or sizes. It can be thought of much like a widget in today’s operating systems: the system defines what the data item is and what size it should take up, then it relies on the data item’s hosting application to provide the view component that renders it.

Stay tuned

To receive updates, watch this space or subscribe to the mailing list:




We discussed what makes files composable and extensible, how to be supportive of files in ecosystems where they aren’t present (such as mobile), what changes when using files via Zero Data protocols, and more. Participants included Alexander Cobleigh, Boris Mann, Doug Reeder, Gordon Brander, Jess Martin, Noel De Martin, Rosano.


The half the video failed to record, and rendering for the remainder was glitchy, so this is essentially an audio podcast.

time section
00:00 Intro
01:31 Aggregators dominate the web
03:08 Aggregators are incentivised to keep systems closed
05:13 Every app eventually implements email and Clubhouse
06:19 Files and app security
07:58 Files as a lego dot of computing
10:39 Files give data an object metaphor
12:22 Disadvantages of files on the network
13:44 LAMP stack is too hard
15:05 Civilization-scale infrastructure for persisting information
16:10 Nouns, verbs, and files
18:08 Files enable interoperability to emerge
22:20 Build tools around workflows
25:03 Customizing apps without programming
26:52 Authentication raises the barrier to entry for interoperability
28:41 Helping people understand where data lives
30:21 Authorization dialogues are complex
32:19 Comparing Personal Data Store with Wallet
34:03 Comparing access via apps and search
37:51 Why does stuff need to exist only in one place?
40:58 Teaching people drag-and-drop with Tiddlywiki
43:06 Complexity of network connections with scale
43:46 File formats are like network hubs
45:40 Drag-and-drop is a versatile endpoint
47:00 Helping people understand technical metaphors
48:39 Patterns from web3 wallets
50:07 QR codes for transferring data
51:21 Collaboration via Croquet and QR codes
53:26 Global and unique and memorable
56:11 Trust by device proximity
57:30 Keeping parity with features popularized by Apple
61:19 Interoperability by producing narrow output and accepting broad input
65:29 Onboarding issues
67:19 QR codes enabling multiplayer


The first half of the chat was lost due to a call drop. These times reflect a start time of 16:00.

16:48 cblgh says: ( haha oh dang, sorry for dropping out x) )
16:48 Noel says: ( I think everyone did )
16:49 Rosano says: ( if anyone has the old chat can they save it? )
16:49 cblgh says: ( “tiddlers” thoooooo )
16:49 Jess says: ( we all lost it :frowning_face_with_open_mouth:((( )
16:50 Gordon says: nooooooo
16:50 Gordon says: TiddlyWiki is so compelling
16:50 Gordon says: ( Composability with other tools - by Gordon Brander - Subconscious)
16:53 Jess says: it’s the cause of Brooks Law
16:53 Jess says: as well
16:53 Jess says: Brooks's law - Wikipedia
16:53 Jess says: “Communication overhead increases as the number of people increases. Due to combinatorial explosion, the number of different communication channels increases rapidly with the number of people.[3] Everyone working on the same task needs to keep in sync, so as more people are added they spend more time trying to find out what everyone else is doing.”
16:53 Jess says: we’re focusing on the workflow! :stuck_out_tongue:
16:53 Jess says: the UX
16:53 Jess says: the action
16:53 Jess says: sets up an expectation that it will work
16:53 Jess says: atJSON
16:53 Jess says: ( :stuck_out_tongue: )
16:54 Gordon says: ( can y’all share a link to this? )
16:54 cblgh says: HTML Drag and Drop API - Web APIs | MDN
16:54 Boris says:
16:55 Gordon says: ( love it )
16:56 Boris says: And then the actual reference docs for TW TiddlyWiki/Dev — documentation for developers
16:56 Boris says: OK, it’s already a bag of JSON. Title and Text and arbitrary custom fields var titleString = “This is the string that appears when the block is dragged to a text input”; var tiddlerData = [{title: “Tiddler One”, text: “This is one of the payload tiddlers”}, {title: “Tiddler Two”, text: “This is another of the payload tiddlers”, “custom-field”: “A custom field value”}];
16:58 cblgh says: it’s interesting to think about the “education of users” from the perspective of storytelling; do you do the exposition thing and dump it all on people in the beginning (“hello, welcome!” screen), or do your characters (whatever that is in an app? a feature? its affordances?) pull people in gradually to the understanding
16:58 cblgh says: ( lol cmd-w is lethal in notetaking apps in browsers (it doesn’t delete the last word!!) )
16:58 Jess says: ooooooooohhh I like this direction
16:58 Jess says: ( we’re working heavily with QR codes at Croquet )
16:58 Gordon says: ( 100 )
16:59 Jess says: and to think of their phone as a container!
16:59 Jess says: or my phone as the key…
16:59 Jess says: ( or something )
16:59 Gordon says: ( yes! )
16:59 Jess says: ( the metaphor )
16:59 Rosano says: ( @cblgh i avoid the hello welcome but fail to do onboarding… something fundamental to think about, i like the story metaphor )
16:59 Gordon says: ( It makes intuitive sense. Phones are very personal. )
17:01 Jess says: 2FA
17:01 Jess says: in general
17:01 Jess says: ( magic links, so true )
17:01 Noel says: ( We were talking about gen Z before, I think a lot of them don’t even use email, they just have social logins (like login with Facebook) )
17:01 Doug says: This particular hardware didn’t catch on, but this video shows where we’d like to be: Zap Photoshare - YouTube
17:02 Jess says: Squaring the Triangle: Secure, Decentralized, Human-Readable Names (Aaron Swartz's Raw Thought)
17:02 cblgh says: great article on squaring zooko’s triangle for a particular set of use cases
Backchannel: A relationship-based digital identity system
17:02 Boris says: doesn’t square it at all
17:02 Boris says: it uses pet names
17:02 Boris says: ( not globally unique )
17:03 cblgh says: ( the relationship is though )
17:03 Boris says: ( yep! )
17:04 Jess says: ( I definitely will, because I want to work on more hardware stuff once we solve this software stuff :smiley: )
17:04 Boris says: ( @Rosano – please make sure to copy / paste / export this chat at end of call )
17:05 Rosano says: ( @boris just copied now, hope to copy later, the first chat may be gone )
17:06 Jess says: ( amazing UX )
17:07 Rosano says: - YouTube
17:07 Rosano says: ( ethereal blue dots )
17:07 Doug says: ( That youtube video is private )
17:07 cblgh says: kinda related project i put together for sharing cabal keys across computers in physical space “whisperlinks” “share hard-to-transmit snippets with easy-to-pronounce names using dht magic”
17:08 Boris says: ( Oh yeah, the video is private )
17:09 Gordon says: Celestial Emporium of Benevolent Knowledge - Wikipedia
17:10 cblgh says: oops gotta go, thanks for the chat everyone!
17:10 cblgh says: ( (sorry i didnt participate that much, but 23:00 here ':smiley: )
17:10 Rosano says: ( see ya alex! thanks for coming, good night )
17:10 Gordon says: ( thanks everyone! )
17:11 Jess says: Robustness principle - Wikipedia “Be conservative in what you do, be liberal in what you accept from others.”
17:11 Jess says: and text can be assumed to be first line…
17:11 Jess says: ( sorry, title can be assumed to be first line of text )
17:12 Gordon says: ( Files, copy/paste, drag-drop the ur-interop features )
17:13 Jess says: ( opencollective??? )
17:13 Gordon says: ( I Would Simply Have Expede Solve Sync )
17:13 Jess says: ( I’m free :wink: )
17:13 Gordon says: ( I’m game )
17:14 Boris says: ( passwordless file-less onboarding something something )
17:14 Jess says: ( “shared language of onboarding in passport-less, data-less systems” )
17:14 Gordon says: ( +1 doorless is awesome )
17:15 Jess says: ( MAYA: most advanced, yet acceptable )
17:15 Noel says: ( doorless does not contradict onboarding, you can put an onboarding in place of a blank canvas )
17:15 Jess says: oooooh the interactive tutorial is AMAZING btw
17:15 Noel says: ( that’s sort of what I did with Media Kraken )
17:15 Rosano says: ( @noel but that takes work )
17:15 Jess says: ( natto | a canvas for JavaScript)