Skip to content

Latest commit

 

History

History
213 lines (126 loc) · 10.5 KB

Submission.md

File metadata and controls

213 lines (126 loc) · 10.5 KB

Inrupt Developer Workshop Submission

Description

An app is worth a thousand words!

Go to https://sleepy.bike ❤️

Definitions

  • hospitality exchange (hospex) community: A community of people who want to offer each other (free) accommodation, meet in reality, and more.
  • offer: Accommodation that one member of a hospex community (host) offers to others (guests).

Motivation

Members of hospitality exchange communities have a problem. Once, they joined a hospitality exchange network. They enjoyed interactions with other members in real world and had a jolly good time. It was a cozy community, run by volunteers. A community with it's unique spirit, built on trust and openness.

But then something happened. Mindset of the people in control changed. Suddenly, the access to the community got hidden behind a paywall. Directors started disowning the volunteers and their work. Things got rather grim.

CouchSurfing paywall

Saemy wrote about the bicycle touring community WarmShowers:

WarmShowers used to be open and inviting. Discussions were held in public, feedback and questions were handled in a publicly visible forum, membership was possible for everyone and free.

Unfortunately, a lot of that changed in the past years: Decisions are now made by a board that is hardly reachable and does not give insights to their decision process, critics are not welcome, membership is only available to the ones that can afford it, apps became highly priced and source code was made private, ...

So the members flocked to another platform. And then another. Some ended up with 5 accounts for 5 different communities. And although a single user can relatively easily move from one platform to another, the community, as a whole, remains trapped.

Finally, out of grief of former WarmShowers android app volunteer developers, the Open Hospitality Network was born. And now we're trying to decentralize and federate hospitality exchange - to solve the issue of centralized boards ending up with too much power and locking their own communities in a platform the members cannot influence or move away from - once forever.

And here we are, implementing hospitality exchange with Solid.

Open Hospitality Network meeting 2021-11-08

image above: We've showcased the app to some of the people of OHN last Monday. Workshop participants (Mariha and Michal) are in the last row.

Features

When a user uses the app for the first time, a document at https://mysolidpod/public/hospex.ttl is created, where all their relevant data will be stored.

Implemented features: What the app can currently do

First, sign in. After a first successful authentication, you'll be prompted to get started. Then, you'll be walked through necessary steps to use the app to its full potential.

Join a hospex community

At https://sleepy.bike/communities, you can see a list of available communities and join communities that you like.

All of your data are stored on your solid pod. The community only contains a list of community members' webIds, which only members can access. In the future we'll also need (semi-)centralized indexes to allow discovery of people by their location.

Here comes the power of Solid. You can use a single account to access many communities. And when one of your communities goes corrupt, you can move to another and keep your account and all of your data. Because you own it.

See your or other people's profile

At https://sleepy.bike/users/[webId], you can see your profile, and a profile of other hospex community members.

Create, update and delete a hosting offer

At https://sleepy.bike/offers, you can offer accommodation to others, and manage it.

See other offers on a map

At https://sleepy.bike, you can see a map with all users who belong to your communities. When you travel, here you can find places to stay and people to meet.

Still not implemented: Plans for the future

Edit your profile

  • add a description, contact information, your interests, ...

Send messages to other members

  • maybe this is necessary, maybe not

Post your travel plans...

  • ...and members of various communities (even those you can't see) from the area will be notified, and can invite you
  • We'd like to implement this feature with ActivityPub, and make it interoperable with existing non-solid communities, so users can reach many others.

Connect to others

  • Create connections with people you know :me foaf:knows myFriend: .
  • 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

  • offer your garden to a community of hikers and your princess bed to glouchsurfers

Scale

The current architecture doesn't work for large numbers of members. We can't fetch everybody's profile. We need an index which will allow easy discovery of people by their location.

Create and manage a community

  • Currently we're creating communities manually 😫

Customize the app to the needs of different communities

How we built it

It's been a journey... 🚴

We have

  • figured out the minimal application architecture
  • met in reality 🍂
  • struggled with Solid limits, especially related to permissions (we need them tight) and solid server implementations incompatibility
  • asked many questions at Solid project forum and workshop slack
  • created a hospex vocabulary and even got a namespace for it at w3id.org
  • we built the app
  • last but not least, we've learned a lot of new stuff about Solid and how it can be used to build social networks based on groups and communities!

Data model

Data model of ohn-solid

Vocabularies we used

  • hospex - Hospitality Exchange vocabulary we created as part of this workshop
  • sioc
  • vcard
  • wgs84
  • rdfs, foaf - little

Data flow

  1. When User signs in for the first time, they're prompted to get started. At that point, a hospex document at https://theirsolidpod/public/hospex.ttl is created.

  2. When User signs in, a list of all user's communities, along with a list of curated communities is downloaded. The data include community's

    • name
    • description, and
    • (when user has sufficient permissions) a list of members

    All these community data are stored at community solid pod.

  3. Data of all found members are downloaded. That is

    • name
    • profile picture
    • offers
      • location
      • description
    • uris of communities user is member of

    All these data are stored at personal solid pods

  4. Data of all newly found communities get dowloaded (e.g. communities of found users that aren't curated or user is not member of)

  5. And back to step 2-5 until we can't find anything new

  6. When a user joins a community, the triple vcard:Group vcard:hasMember :me. gets appended to the list of community members. Now that they're a member, they have a permission to read the list of other community members. So the list gets fetched and steps 2-5 are repeated with this newly joined community and its members

What we learned

We figured out how to implement social networks over Solid.

We chose the approach of groups/communities, because it is most natural for hospitality exchange. That means, people find each other by joining communities.

We wanted to have the communities secure, so only their members would see the list of other community members. We learned how to use acl:AgentGroup for that purpose.

We also wanted to limit who can see a person's hospex data, to other community members only. We didn't succeed at that, and personal hospex data is public at the moment. This issue should get resolved before going to production!

We wrote a vocabulary following solidproject tutorial, and got a namespace for it at w3id.org!

Limitations we hit

Incompatibility of Solid Servers

The app consistently works only with Node Solid Server.

(todo)

Permission limits

(todo)

Tech Stack

Generic

  • Typescript - takes care of many headaches that JavaScript doesn't, so development is much more fun
  • React - the most popular Javascript frontend framework
  • Redux - for application state management
  • Tailwind.css - css framework that we tried out for the first time

Inrupt tools

Demonstration Video

Demonstration video on YouTube

Industry

🎉 other 🎉

We've created a Social Network, which helps people to meet each other in reality, and offer hospitality to each other.

other therefore means:

  • Hospitality
  • Community
  • Social Networks

Repository

OpenHospitalityNetwork/ohn-solid

License

MIT - https://opensource.org/licenses/MIT