This looks like an attempt to combine RSS with social media. Could be interesting if it works.
Pretty much how Iāve been saying the social web should have worked all along. This isnāt even a new concept. Other people have been saying it for years: The Hyperchat Modality
The āsocial webā really is just wrappers on top of RSS, huh.
Iād steer clear of this place at all costs. Per their privacy page:
Information We Collect Automatically
We automatically collect certain information about your interactions with us or our Services, including:
Device and Usage Information
We collect information about how you use and access our Services, including operating system version and browser version, but we do not collect hardware device identifiers or network identifier information. We also collect information about your activity on our Services, including access times, pages viewed, connection speed, page load speed, and links clicked.
Information We Derive
We may derive information or draw inferences about you or your browsing behavior based on the information we collect. If, for example, you provide your information to us, such as email address, we can infer that the page views and other ways that you use our Services relate to that email address.
USE OF INFORMATION
We use the information we collect to administer your account and provide our services and products. We also use the information we collect to:
- Provide, maintain, improve, and develop new products and services, including to debug and repair errors in our Services;
- Personalize your experience with us;
- Send you technical notices, security alerts, support messages and other transactional or relationship messages;
- Communicate with you about products, services, and events offered by Herd Works and others and provide news and information that we think will interest you (see the Your Choices section below for information about how to opt out of these communications at any time);
- Monitor and analyze trends, usage, and activities in connection with our products and services;
- Detect, investigate, and help prevent security incidents and other malicious, deceptive, fraudulent, or illegal activity and help protect the rights and property of Herd Works and others;
- Comply with our legal and financial obligations;
- Create de-identified, anonymized or aggregated information; and
- Carry out any other purpose described to you at the time the information was collected.
DISCLOSURE OF INFORMATION
We share personal information in the following circumstances or as otherwise described in this policy:
- We disclose personal information with vendors that access personal information to perform work for us, such as companies that assist us with web hosting and marketing.
- If you provide a product review or otherwise share content on our Services, we share this information publicly/with other users of our Services.
- We may disclose personal information if we believe that disclosure is in accordance with, or required by, any applicable law or legal process, including lawful requests by public authorities to meet national security or law enforcement requirements.
- We may share personal information if we believe that your actions are inconsistent with our user agreements or policies, if we believe that you have violated the law, or if we believe it is necessary to protect the rights, property, and safety of Herd Works, our users, the public, or others.
- We share personal information with our lawyers and other professional advisors where necessary to obtain advice or otherwise protect and manage our business interests.
- We may share personal information in connection with, or during negotiations concerning, any merger, sale of company assets, financing, or acquisition of all or a portion of our business by another company.
- Personal information is shared between and among Herd Works and our current and future parents, affiliates, and subsidiaries and other companies under common control and ownership.
- We share personal information with your consent or at your direction.
We also share aggregated or de-identified information that cannot reasonably be used to identify you.
TL;DR: they record everything you look at, explicitly tie it to your personal information, use it to advertise at you and sell your personal data to anyone who pays for it.
And all for something you can do yourself with an RSS reader and a blog hosted anywhere.
I feel like thatās 99% of these kinds of hip change-everything tech āservicesā. Every Revolutionary New Way To Do X is just an open protocol in a proprietary surveillance wrapper.
Hi there @rmf
my name is Caleb. I am the developer of HyperTexting.
Thank you for your feedback on the privacy policy. I also care very strongly about privacy, so I really appreciate you taking the time to look at that and point out any potential issues.
I forgot I had pointed the App Store privacy policy link at the website privacy policy. I was being lazy. I should probably add a separate privacy policy for the app because it is very different from the website.
The privacy policy you linked to describes the data collection I do on https://hypertexting.com (the product marketing website). And that privacy policy probably overstates how much data I do collect. I get whatever Cloudflare collects (my web hosting service) and I pay for https://plausible.io, which I chose because they claim to be āprivacy-friendlyā. The only data I actually look at is daily uniques and referrers - which is how I found this post. Plausible only shows the host a referral came from, in this case ādiscourse.32bit.cafeā, so I came here and searched the forums and found this thread. ![]()
I have taken great care to build HyperTexting (the app) to do 100% of its processing on-device. Even searches performed from the discover tab of the app are performed on-device!
Without getting into too much detail it basically fans out search queries across some deterministic search provider functions that construct deterministic feed URLs for a variety of platforms that offer RSS feeds, and then it does HTTP HEAD/GET requests to check for a feed. Hereās a screenshot of that code:
// The default SearchEngine fans out to every available on-device QueryProvider.
public static var `default`: SearchEngine {
return SearchEngine(providers: [
FeedFinder.URLProvider(),
FeedFinder.DomainProvider(),
FeedFinder.CommonTLDProvider(),
FeedFinder.WordPressProvider(),
FeedFinder.TumblrProvider(),
FeedFinder.MediumProvider(),
FeedFinder.MicroBlogProvider(),
FeedFinder.RedditProvider(),
FeedFinder.SubstackProvider(),
FeedFinder.YouTubeProvider(),
FeedFinder.ItunesProvider(),
])
}
Each of these providers supports or more of the following query kinds. The app uses some pretty simple heuristics to determine if the query looks like a url (with a http:// or https:// scheme), or if it looks like an email (using a regular expression), or if it looks like a username (a string that starts with an @ symbol followed by one or more alphanumeric characters), or a slash (e.g. a reddit /r/whatever query), or a hashtag (similar regular expression as usernames, except they start with a #), or a phrase (basically any query with spaces in it). Any query that is only one string of text with no spaces and it isnāt a url/domain/email/username/slash/hashtag is a keyword query.
public enum QueryKind: String, Sendable {
case url
case domain
case email
case username
case slash
case hashtag
case phrase
case keyword // default
}
Here is the actual source code for the Reddit provider:
import Foundation
extension FeedFinder {
// RedditProvider synthesizes a reddit.com .rss URL from a slash, username, or
// keyword query and HEAD-probes it before returning a Discovery.
//
// Slash queries are only supported when they start with "/r/" or "/u/".
//
// Query URL formats:
// * "/r/rss" -> "https://reddit.com/r/rss.rss"
// * "/u/calebhailey"-> "https://reddit.com/u/calebhailey.rss"
// * "@calebhailey" -> "https://reddit.com/u/calebhailey.rss"
// * "rss" -> "https://reddit.com/r/rss.rss"
public struct RedditProvider: FeedFinder.QueryProvider {
public init() {}
public var name: String { return "reddit" }
public func supports(kind: FeedFinder.QueryKind) -> Bool {
return kind == .slash || kind == .username || kind == .keyword
}
// validate rejects .slash queries that don't start with "/r/" or "/u/".
// All .username and .keyword queries with a non-empty slug are accepted.
public func validate(query: FeedFinder.Query) -> Bool {
let trimmed: String = query.value.trimmingCharacters(in: .whitespacesAndNewlines)
switch query.kind {
case .slash:
return trimmed.hasPrefix("/r/") || trimmed.hasPrefix("/u/")
case .username:
return !self.slug(for: query).isEmpty
case .keyword:
return true
default:
return false
}
}
public func search(query: FeedFinder.Query) async throws -> [HyperFeed.Discovery] {
let trimmed: String = query.value.trimmingCharacters(in: .whitespacesAndNewlines)
let feedURL: URL?
switch query.kind {
case .slash:
feedURL = URL(string: "https://reddit.com\(trimmed).rss")
case .username:
feedURL = URL(string: "https://reddit.com/u/\(self.slug(for: query)).rss")
case .keyword:
feedURL = URL(string: "https://reddit.com/r/\(trimmed).rss")
default:
return []
}
guard let feedURL = feedURL else { return [] }
guard let discovery = await self.probe(feedURL: feedURL, htmlURL: nil) else { return [] }
return [discovery]
}
}
}
If this is at all interesting to you then you might be wondering, what does the āCommonTLDProviderā do? Iām so glad you asked! It only supports keyword searches and it basically queries a handful of TLDs and checks for feeds. For example, a search for āmantonā checks to see if there is a feed at
manton.com,manton.net,manton.org,manton.io,manton.me, andmanton.blog. Why those TLDs specifically? I canāt remember but Iām pretty sure it was some mix of my personal opinion and a ChatGPT query for the top 10 most used domain TLDs.
One cool side-effect of this on-device query system is that the requests look like regular HTTP traffic to these services, and they come from the actual device IP address (or if you have Private Relay it comes from one of those IP addresses), not some centralized infrastructure. My hope is that this will prevent the various hosting services from blocking this search traffic.
I do operate one backend service for HyperTexting and it handles two very specific functions:
-
If a user submits an email address on one of the ācoming soonā waitlist views in the app, the app makes an HTTP POST request to my backend API, which integrates with the
https://hypertexting.communityDiscourse API to send the user an invite. This falls pretty squarely under the āwe only collect data you provide usā umbrella from the website privacy policy. -
If a user logs in to their Wordpress account from HyperTexting (for an upcoming posting feature), that request is routed through the HyperTexting API specifically so I can use OAuth and not ask users to input their password anywhere in the app. In order to support OAuth, you have to register a redirect URL where Wordpress can confirm that the user has successfully authenticated (see:
https://developer.wordpress.com/docs/api/oauth2/).
The only data I get from users of the app is whatever Apple collects and provides in App Store Connect.
I hope this helps address any concerns you have about HyperTexting app privacy.
Thanks for prompting me to write this as Iāll probably polish this up and make it a proper blog post. ![]()
Cheers ![]()
I would be curious to understand which part of the privacy policy suggests we may sell personal data. I am personally committed to avoid doing that so if there is a gap in the privacy policy that even suggests we may do this, I would like to close that gap.
And again - I have zero visibility into content users see in the app. The only data we record is what pages anonymous visitors view on our website. We have no way of linking a specific visitor to any personal information, but my attorneys advised that if we have a contact form we would need to say that we could link submitted contact information with website activity - but Iām not even sure how I would do that.
This is actually a really excellent idea, if I understand it correctly: feed reader + homepage with webmention-style interactions + easy search/links/mentions, all wrapped up in a social media-style gloss. There are lots of indie sites geared toward making it easy to start a blog or what have you, but as far as I know there isnāt any all-in-one solution friendly to noobs like this.
I do wonder how brittle it would be in practice, though. Can you really smooth over all the rough edges, or will people expecting a āsocial media appā get frustrated?
I also share @rmfās skepticism. Even with @calebhailey.comās thorough and seemingly quite sincere explanation, I donāt trust anything that isnāt open source. If the situation changes, you canāt just switch to a fork.
Also⦠I donāt have an iPhone. Iād be very curious to hear from people who do what they think of it.
We collect information about how you use and access our Services, including operating system version and browser version, but we do not collect hardware device identifiers or network identifier information. We also collect information about your activity on our Services, including access times, pages viewed, connection speed, page load speed, and links clicked.
You collect most everything the user does within your app.
If, for example, you provide your information to us, such as email address, we can infer that the page views and other ways that you use our Services relate to that email address.
You connect that collected information to the userās personal information.
Communicate with you about products, services, and events offered by Herd Works and others and provide news and information that we think will interest you (see the Your Choices section below for information about how to opt out of these communications at any time);
You send advertising based on this information.
We disclose personal information with vendors that access personal information to perform work for us, such as companies that assist us with web hosting and marketing.
You disclose the information to external parties.
You canāt ChatGPT your way out of that crystal clear privacy policy. If the policy is in error as you say it is, that signals carelessness when it comes to how youād handle potentially sensitive data. That is to say, if you add the wrong privacy policy by accident, what else is amiss? Of course we couldnāt see if there was or wasnāt, as your software is proprietary. Iām sorry, but none of it so far adds up to a secure service.