Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

In a series of articles we document how we build a distributed hospitality exchange over [Solid](https://solidproject.org).

[comment]: <> (Who are we? Would be nice to write that it was you together with OHN project/team or you as part of it)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely!


[Start here](intro.md)...

---

[comment]: <> (I enjoyed the mystery of unknowing "what happened next" but I believe many people may prefer to know what to expect before starting to read, so you may consider to add an overview here)
... or jump over directly to one of the chapters:

1. [Developing a distributed app with Solid](intro.md) \
Expand Down
45 changes: 28 additions & 17 deletions group-community.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ _Well, now, as i'm writing this, i've [submitted](https://lov.linkeddata.es/data

I can offer people a place to stay. But how do they ever find me? At the moment, our data live in different places, and we have no way to find each other. Internet is a vast place...

### 1. Crawl
### 1. Crawl a network of friends of a friends

Well, people can look at their friends, and friends of friends, and friends of friends of friends, and so on, and see if somebody offers a place to stay; and where it is.
Well, people can ask (look at the profile of) their friends, and friends of friends, and friends of friends of friends, and so on, and see if somebody offers a place to stay; and where it is.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

people can look at the profile of their friends or people can look at the data of their friends sounds good to me. To me ask represents act of asking them, and getting answers, which they don't do.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought it would be nice to make it a bit more general in a way that in real/physical/offline world people would ask their friends and this is what the program "models" but I don't insist.

This would only work if the network of friends is dense and well established. But if i'm new to the network, or if somebody is new, they won't find me that way.

We could use a network of hospex contacts (To Be Done) to perform the same search.
Expand All @@ -28,13 +28,19 @@ We could use a network of hospex contacts (To Be Done) to perform the same searc

- We host people in our friends network, so we can feel safer with them
- We don't need any additional search system
- No centralized infrastructure that could be compromised at a risk of whole communities being lost

#### Disadvantages

- New people can't find others, and others can't find them
- Networks may be disjoint (i.e. two or more disconnected groups), and therefore not know about each other, essentially making separate communities
- Offers have to be public. Currently Solid doesn't have any mechanism to give permissions to friends of friends of friends of friends, and nobody else. (We could make a crawler that collects these "foafoafoafs" to a single group, and give permissions to that group.)
- We don't have any notion of a Community (e.g. cyclists, hitchhikers, ...) - like [different](https://welcometomygarden.org/) [hospex](https://www.bewelcome.org/) [communities](https://www.facebook.com/groups/hostasister/), or different [Trustroots Circles](https://www.trustroots.org/circles)
- Offers have to be public. Currently, Solid doesn't have any mechanism to give permissions to friends of friends of friends of friends, and nobody else. (We could make a crawler that for each user collects these "foafoafoafs" to a single group, traversing the graph to certain depth, and give permissions to that group (or rather request members of that group to give permission to read their data).)
- We don't have any notion of a Community (e.g. cyclists, hitchhikers, ...) - like [different](https://welcometomygarden.org/) [hospex](https://www.bewelcome.org/) [communities](https://www.facebook.com/groups/hostasister/), or different [Trustroots Circles](https://www.trustroots.org/circles) (could be done with "tags" stored in a profile)
- Search by location would require prior fetch and scan of a whole network of foafoafoafs, that would take waaaaaaay to long to be usable (scalability and app responsiveness issues) unless we cache that data locally but then it can get stale, needs refreshments, ... gets a bit complicated. A cache could be structured as a geospecial index though, specifically created for each user from their own network. That might be not that bad idea, actually.
- There is no common space to broadcast messages (invitations to stay or requests to be hosted), unless we had a wall of messages from foafoafoafs, stored locally and refreshed similarly as messages in SSB?
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this already assumes an architecture: That we don't send messages to others directly, but put them on a wall for others to discover?
Or is this about messages that are public by their nature? Like request for an area (not a person)?

I think this, also with comparing to SSB, makes it a bit complicated. I'd keep it for future reference, but prefer not to include for now, for simplicity and clarity.

Definitely makes sense to include when we'll start discussing messaging architecture (future)


#### Other characteristics

- Networks may be disjoint (i.e. two or more disconnected groups), and therefore not know about each other, essentially making separate communities. Depending on the context, this can be desired or not.

### 2. Make a place to discover each other

Expand All @@ -45,28 +51,27 @@ Improvement #2.1: Make the group members searchable by location, creating a geo
#### Advantages:
- People who previously didn't know each other can find each other
- Solid has a way of sharing permissions with groups of people - our data don't have to be public - we only share our offers with members of our community or communities (well, ehm, we'll see about that in a moment...)
- Belonging to something bigger then a single individual is, like a community, can be a source of an identity (in human, offline sense)

#### Disadvantages:
- Centralized solution, a single point of failure, a single point of control
- Centralized solution for a community, a single point of failure, a single point of control. However:
- if there were many independent communities like this (run on different servers by different people), and everyone was a member of a few, it becomes more decentralized.
- a group could be replicated, and an index could be distributed over a few nodes, with some redundancy.
- If we don't make _Improvement #2.1_, we have to fetch all members' offers in order to find hosts in the area we travel to


### 3. Make a distributed way to discover each other (Distributed Hash Tables)
[comment]: <> (### 3. Make a distributed way to discover each other &#40;Distributed Hash Tables&#41;)

I don't know what i'm talking about... just using some trendy words here. Only in most vague and foggy way can i imagine how this would function
[comment]: <> (I don't think it would work actually.
It is possible to have an index distributed over a few nodes, that could be queried by location.
It is also possible to have a key-value store distributed over a few nodes, implemented as a distributed hash table, it would be queried by keys, not sure what they might be.
I suggest removing this point alltogether. )

Somehow, everybody would host a part of the group/network/index on their own Solid Pod, and somehow, magically, people could find each other that way

#### Advantages
- distributed system, no central point of failure

#### Disadvantages
- complicated, hard to understand
- no clear way to manage permissions (do data have to be public again?)
### (both solutions can coexist next to each other)

---

These are all valid options. For starters we went for the middle option - making a centralized group to discover each other
These are all valid options. For starters we went for the latter option - making a centralized group to discover each other


## How to make a group
Expand Down Expand Up @@ -114,9 +119,11 @@ We want to:

1. Make a public group
1. See if we can authorize the group members to access a resource
1. See if others who are not a member of a group can see us but not a resources
1. Make the group private - self-referencing (The group can be viewed by members of itself)
1. See if we can see other members of a group
1. See if we can authorize the group members to access a resource
1. See if others who are not a member of a group can not see us or a resources

Because ideally, the group members are visible only to each other, and can share their hosting offers only with each other.

Expand All @@ -137,6 +144,10 @@ Basically, at this point, the options are two:
1. Everybody in the internet can see the list of hospitality exchange members
2. Group is private, but the people's hospex data are public. ([this doesn't work if the group is hosted on CSS](https://github.com/CommunitySolidServer/CommunitySolidServer/issues/1442))

[comment]: <> (What if we had a functional webId for each hospex community, and we created a public Solid Group that included them and authorized only members of this group to see people's hospex data? Each community would have a separate app/webpage, with their own webId. Only app would be authorized to access hospex data of members of the community it serves. The members directly or other apps/communities would not be authorized to read that data.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting, let's discuss this further!

I don't fully grasp: so all the hospex data would get proxied through the community? E.g. community would fetch the data (because it has the permission to read) and then it would pass the data further to the end user?

Copy link
Owner

@mrkvon mrkvon Sep 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like a lot the idea that an organization could have its own id. Possibly https://id.sleepy.bike ... :) There was a piece about webIds at the July (2022) Solid World... (the whole talk of that presenter starts at 38m24s)

How we could and wanted to use this id, that's for further discussion - i haven't properly thought through the possibilities....

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't fully grasp: so all the hospex data would get proxied through the community? E.g. community would fetch the data (because it has the permission to read) and then it would pass the data further to the end user?

yup, exactly. Basically, we'd add a layer of indirection into who is authorized to access the data. A user would not access it directly but rather the app would do it for them. This gives also more flexibility to what the app does with the data, could for example display a map with hosts before a person is logged in.

I'll try to watch the video tomorrow morning.

Trust between communities could be established by granting or revoking access to resources of one community for the webId corresponding to the other community
Only the apps could write to hospex.ttl files and they could enforce and validate expected file format for the offers that belong to them, a format that would be specific to them and they would have freedom to change and maintain it)

We chose the second option to start. But it's a difficult choice, two suboptimal options...

### Finally, making it
Expand Down
28 changes: 22 additions & 6 deletions intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ I think [Solid](https://solidproject.org/) is an interesting idea. But it suffer

I don't care for the inception ideas. I don't care for authority in Solid. I don't care for your new Specification. I want it to work.

[comment]: <> (I don't care for your new Specification)
[comment]: <> (it's unclear to me who is "your" here. Maybe adding a link under "Specialization" will help, or changing "your" to somthing more specific?)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. So apparently this is not written clearly.

I speak about Specs (i.e. RFCs) that academic-minded people like to produce, before having the proof of concept.

Example of spec-focused vs lets-make-it-work-focused spec is XML vs JSON as data exchange format (not in our context, though), or as Aaron Swartz wrote in Intro to Programmable web:

With them has come academic research and government grants and corporate R&D and the whole apparatus of people and institutions that scream “pipedream.” And instead of spending time building things, they’ve convinced people interested in these ideas that the first thing we need to do is write standards. (To engineers, this is absurd from the start—standards are things you write after you’ve got something working, not before!)

Perhaps we could add link to the efforts of solid interoperability panel... :) Not sure if it's offensive to point fingers, though...

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, yea. I like to say that for me standards should emerge from many tested solutions to a problem as the ones that get used and adapted most often and hence they become standard(s), rather than something being enforced as a standard. Clearly top-down vs bottom-up approach to problem solving.

Perhaps we could add link to the efforts of solid interoperability panel... :) Not sure if it's offensive to point fingers, though...

I think you could add a link.


For me, Solid is:

1. an identity provider
Expand All @@ -35,6 +38,11 @@ As I said, i want to develop great real-social applications. Applications that c

One well explored, and popular use case is Hospitality Exchange. It's pretty clear what the system should do.

[comment]: <> (would be great if you mentioned somewhere here, here-here or elswhere on this page, how your collaboration with me or/and OHN started, what OHN is about and how it fits together with Your agenda. Maybe also a few words about sleepy.bike, who is it for and where it comes from? I'll be happy to discuss or draft parts of this if it was helpful.)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great. Definitely, let's include.

If you have some text, or could draft some, that could be helpful. We could even make a shorter comment here and link it to a longer text with its own separate page. :)


[comment]: <> (I would describe OHN as an effort to design and build next generation hospitality exchange platform. One that would be federated (decentralized and interconnected\) in order to address issues and the long-term consequances many hospex communities have faced over the years of existance and which we believe are related to centralized infrastructure they've been built on.
Or something along these lines.)

So, let's focus on Hospitality Exchange for now.

## What is it supposed to do?
Expand All @@ -45,29 +53,37 @@ In the simplest case:

0. Sign in
0. Write a little bit about yourself
0. See a map of people who offer to host travellers
0. Open a profile of, and read about a few potential hosts, their references from other travellers, ..., get impression that you'd be reasonably safe with them
0. See a map of people who would like to host fellow travellers

[comment]: <> (I like also a phrasing "people who invite fellow travellers to stay at theirs home/place". For me "people who offer to host sb" seems somehow very transactional, like the verb "to offer" implided that ones gets something in return. And I know usually they do, but I feel like it's better not to expect that.
Maybe it's that the word "offer" has sales connection to me, where things are exchanged for money in a trasactional way)
0. Open a profile of, and read about a few potential hosts, what they write about themselves and what other travellers wrote about staying with them, ..., get impression that you'll have good time together and maybe that you'd be reasonably safe with them

[comment]: <> (personally I don't consider safety as something to think actively about, I follow my intuition and unless something awakens my inner sense of danger-detection I just go for it. My default is to trust people I'd say. I am writing it because I wouldn't mention safety-verification here, but I don't know how others have. Just to consider removing it.)
0. Contact the potential hosts
0. Wait for their reply
0. When they reply, receive a notification
0. When they reply, get a notification
0. They can host you!
0. Confirm
0. Enjoy the new real world connection, enjoy the stay
0. Enjoy the new real world connection, enjoy the time you spend together and the place, get some recommendations from a local where to go and what to do
0. After the stay, write a reference for them, and establish a friendship connection

Now, you have a home, you want to host travellers in your home:

0. Sign in
0. Write a little bit about yourself
0. Write about your home: Approximate location, and say that you can host people
0. Write about your home: approximate location, and say that you can host people
0. Wait for travellers to write to you
0. Somebody wrote! You received a notification.
0. Read a message from them, read about them, check their references ... get intuition that you'd be reasonably safe with them in your home
0. Read a message from them, read about them, maybe check experiences other hosts described having with them... and get excited about new people you're going to meet!
0. Invite them
0. They confirm
0. Enjoy the new real world connection, enjoy their stay
0. After their stay, write a reference for them, and establish a friendship connection

[comment]: <> (just as a side note: referrences are not a mandotory component, in WarmShowers they were hardly used, other platform may have different trust systems for example based on existing connections or profiles in other social networks.
In Trustroots 'references' are called 'experiences' which I also personally prefer as 'references' seem to me a bit formal and like it was Linked-in or similar network. I belive the phrase 'references' comes from CouchSurfing but I never used it so idk)

---

In a more complex feature:
Expand Down
4 changes: 2 additions & 2 deletions my-profile.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Show my profile
# Show user's profile

_we look what's at webId * triples, triples, triples * fetch my data with inrupt library * fetch my photo * it's annoying, isn't it?_

Expand Down Expand Up @@ -85,4 +85,4 @@ In SPARQL, the above picture would be written like:
write a SPARQL query, with optional stuff...
```

[Next: Offer a Home](offer.md)
[Next: Offer to stay at your home](offer.md)
4 changes: 4 additions & 0 deletions next-steps.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
- send messages to other members
- post travel plans...
- ...and members of various communities (even those you can't see) from the area will be notified, and can invite you

[comment]: <> (the above seems hard... I'd limit it to others from your communities only?)

- connect to others
- _create connectios_ with people you know `:me foaf:knows myFriend` (or a special hospex connection)
- _write a reference_, to tell others about your experience with a particular member (social proof of safety)
- share your hosting offers in a more granular way (specific offers for specific communities)
- scale: geo index, group permissions when groups are large
- create and manage a community via an app
- customize the app to the needs of different communities
- display on a map members of other communities that trust the community of our app