New Feature Launch: Feed Sharing!

You’ve always been able to make your feeds completely public or completely private. Private feeds are hidden from the outside world, no other user can see them and no one browsing Adafruit IO can stumble across them. Public feeds are available as a read-only data source to anyone in the world. Until now, though, there hasn’t been a way to receive data from other Adafruit IO users in your feeds and no way to share your data with just one person.

Feed sharing introduces the ability to share a particular feed with a particular user as a read-only or read-write feed. This means you can keep a feed “private” as far as the whole world is concerned, but allow another Adafruit IO account to send data to it and read data from it.

There are a few new features we had to add to Adafruit IO to make sharing directly with other users possible. Here’s a quick guide to sharing and how to find your way around the new parts of Adafruit IO.

Sharing a feed

Step 1 is to invite another account to share your feed. You can do that from any existing feed page using the new “Sharing” form.

Sharing link in the sidebar on a full-browser feed page

Sharing form on a full-browser feed page

When you invite an account, the person you invite will receive a brief notification email and see the invitation on their shares page. If you share to an email address and they haven’t signed up yet, the person you shared with will have the chance to create a new Adafruit IO account.

new user sharing invite email

If you share with an existing Adafruit IO user via the email address on their Adafruit account or their Adafruit IO username, they’ll be able to review and approve your invitation immediately. After you’ve shared, the user you’re sharing with will get an email:

existing user sharing invite email

And a link to the sharing invitation review page:

reviewing a sharing invitation from another user

The sharing page

This is the hub for all your sharing information. Right now you’ll see listings for feeds you are sharing with other Adafruit IO users, and feeds other Adafruit IO users are sharing with you. If you’re blocking any users from inviting you to share with you, you’ll see those accounts listed on this page too.

sharing review page

As we add sharing features to Adafruit IO, this will be where they show up first.

Sharing feed writes

Since you’re able to share feeds as read/write data streams with other registered Adafruit IO users, data rate limiting has to come into the picture. For this new feature, all data rate usage comes from the publishing user. That means when you share your feed with another user and they publish data to it, your data rate usage will remain unchanged while theirs will be affected.

In order to support in-browser MQTT subscriptions to other users’ shared, non-public feeds, we’ve made changes to the output of our */json MQTT topics. Because these topics aren’t used in any of our libraries and aren’t highlighted in our guides, this change will have very little impact on existing MQTT subscribers. Less than 0.4% of MQTT subscriptions will be affected.

Before, the output of a subscription to test_username/feeds/feed-a/json looked like this:

{
  "username": "test_username",
  "owner": {
    "id": 1,
    "username": "test_username"
  },
  "id": 4,
  "name": "Feed B",
  "description": null,
  "history": true,
  "unit_type": null,
  "unit_symbol": null,
  "last_value": "-23.908",
  "visibility": "private",
  "license": null,
  "created_at": "2018-05-21T20:52:17Z",
  "updated_at": "2018-07-26T18:38:00Z",
  "status_notify": false,
  "status_timeout": 60,
  "enabled": true,
  "key": "feed-b",
  "groups": [
    {
      "id": 1,
      "key": "default",
      "name": "Default",
      "user_id": 1
    }
  ]
}

That’s the same JSON record you would get if you used the HTTP API to retrieve /api/v2/test_username/feeds/feed-b, which is helpful if you want information about the feed, but kind of unhelpful if you actually want the new feed data record that prompted the MQTT message.

After the launch of feed sharing, the same MQTT subscription output looks like this:

{
  "last_value": "-23.908",
  "updated_at": "2018-07-26 18:38:00 UTC",
  "key": "feed-b",
  "data": {
    "created_at": "2018-07-26T18:38:00.560Z",
    "value": "-23.908",
    "location": [
      39.4194156246497,
      -76.69504058954743,
      null
    ],
    "id": "0DY1QDB7K3VN8YDCYCAD538Z5Q"
  }
}

Because of the always-on nature of the MQTT API and the difficulty of changing topics all at once on client devices, we include the legacy last_value field in the new JSON output. If you have a client using */json MQTT topic subscriptions, you should update from json.last_value to json.data.value to access your feed’s data. After a few months of this new MQTT JSON output format, we will deprecate the last_value field and remove it from the MQTT API.

Social web services and your safety and security

Because Adafruit IO is an open web service, we don’t review every single feed sharing invitation before it’s sent. In order to prevent repetitive unwelcome sharing invitations from anyone, we will always give you the ability to: ignore individual invites, block a user from being able to invite you to share, or unsubscribe from all sharing invitation emails.

When you ignore an invite, it will be cleared from your sharing page and the user who invited you won’t be able to invite you to that feed again, but they will be able to invite you to share any other feed they own.

When you block a user, they will no longer be able to share any feeds with you at all. Users will never be explicitly informed that you have blocked them, but they may be able to infer it if they can’t share anything with you. Sharing blocks are permanent until and unless you remove them.

Choosing to unsubscribe from sharing invitation emails will keep your inbox clean, so you’ll have to visit your sharing page to see if you have any new sharing invitations.

Adding a social layer to Adafruit IO has always been part of our plan, but we’ll never make your shares public. If you keep every feed and do all your sharing through direct user-to-user feed sharing, your public Adafruit IO page will still exist but remain empty. We believe that your information should be private by default.

While we do not require moderator approval for social activity on Adafruit IO, we do monitor use of the platform. If we believe a feature is being abused for any reason, we continue to reserve the right to disable the feature or limit your use of Adafruit IO. We care about building the best Internet of Things platform for makers and part of that is making sure that it continues to be a safe space for everyone who uses it.

Guides are coming!

We’ll be adding more information to the Adafruit IO welcome guide with most of this information and we’re always checking the Adafruit IO forums, so if you have any questions about feed sharing please stop by and ask.

This is the first iteration of a pretty new feature for us and we’re excited to see how people use it! Join us in the forum or on Discord in the adafruit-io channel with questions, comments, or suggestions.