Integration request: Readwise Reader

Hey folks, I’ve been using the new Readwise Reader for the past couple of weeks and found it to be superior to other competitors like Pocket or Instapaper. I’m still saving all my articles to Pocket as well because of the Beeminder integration - so it’s a bit of duplicate work for now. Unfortunately no two-way sync between Reader and Pocket as far as I can see.

I don’t really know about Reader’s API capabilities, but if there’s any Beeminder integration in the future, there will be no need to rely on Pocket anymore.

9 Likes

Love it!

We have at least two heavy users of Reader beta on the team, and I talked about building an integration during my onboarding :slight_smile:

Their API is only for adding articles at the moment. Folks may be able to rig up something unofficial… I haven’t looked into it too much.

4 Likes

Added to the list!

https://beeminder.consider.it/readwise-reader-what-should-our-next-autodata-integration-be-92-30282

Place your votes!

3 Likes

This is currently near the top of the list and we (in particular @adamwolf) are hacking away on it!

We’d love more thoughts from you all. Here’s how (I’m pretty sure) we did this for our Pocket integration:

  1. Every time you hit archive on an article in your queue, we give you a +1
  2. No +1 for deleting, only archiving
  3. Unarchiving doesn’t undo the +1
  4. We remember everything you archive (via the datapoint comments) so that we don’t ever double count and give you two +1’s for archiving the same thing twice.

If you use the Pocket integration, are you happy with it? If you’re a Readwise Reader fan, would you be happy with something similar?

(Depending on Readwise Reader’s API, we may or may not be able to emulate the above, but it’d be great to hear people’s thoughts regardless.)

PS: Speaking of the Pocket integration, see also a previous nerdy discussion about that.

2 Likes

Great to see this is getting to the top!

Personally I use Readwise Reader similar to Pocket and what you have listed above as the Pocket’s method looks perfect. Pocket integration currently works exactly as I’d expect it to.

There are people who use different workflows in Reader (as it’s a bit more sophisticated than Pocket), but hopefully the Pocket-like flow might work for most people who want to beemind with it.

5 Likes

I don’t use Pocket.

The proposed Readwise integration wouldn’t work for me (which is not the end of the world).

I use Readwise Reader in two ways:

  1. an archive of high-value items that have a high chance of being useful or interesting to me in future
  2. a read-it-later tool for all sorts of misc web pages, many of which turn out to be crap and are never archived

It’s rare that pages from 2 get moved to the archive. I don’t feel any need to Beemind that (and anyway it’d be an “input” that would be out of my control since it depends on me stumbling across gold).

It’s very common for me to delete pages from 2 when I’ve read them (or when I decide to never read them). That’s what I’d like to beemind so that my Reader inbox doesn’t grow larger forever.

I definitely don’t want most of the pages from 2 to be archived because that would dilute Reader’s search results.

3 Likes

It is looking like the initial integration will be beeminding counts of locations, like Later or Inbox.

(It isn’t finished, and there may be snags that I don’t see yet!)

I think this would do what Alys is looking for? Making sure your inbox doesn’t grow without bound has been pretty helpful to me in other areas.

(The API is very new, but has some corners that make it tricky for us to do some of the integrations. Although the team is very receptive and awesome, they have a lot on their plate and I am not sure how long it’ll take for any changes.)

3 Likes

Yes, that would work for me, thank you!

2 Likes

What about reverse engineering their Browser API in the meantime?

I’m curious why Beeminder doesn’t allow itself to use hacker-ish ways to scrape data. I wouldn’t mind giving my username and password rather than going through an OAuth flow.

Thinking about this makes me want to build my own integrations, now :smiley:

2 Likes

Is it being coy to say that at least one of our integrations uses an undocumented API where we’ve had to do things like sending cookies? :slight_smile:

I’m not speaking for Beeminder as a whole, just for me, but I think two key things are to do our best to reduce the amount of autodata maintenance, and also not wanting to irritate the other party.

Autodata maintenance is actually a really big chunk of how we use our engineering time, and often comes with very little (or no) warning. Beyond causing problems with our users’ goals, this sort of “gotta do it right now with no warning” emergency also helps makes work estimates a nightmare, especially for a very small team. The official APIs tend to be a little bit better than the undocumented ones with regards to warning before changes that break our integrations.

For Readwise, I actually asked them about an API when I was one of the early beta testers, and they had me outline different use cases, and then added an endpoint. I can’t say for certain that they added it just for us, but I think it’s likely. We’ve had some integrations that have brought in (and continue to bring in!) many many new users. The Readwise folks seem super cool, have a bunch of cool users, and I think it’s possible they’d feature the Beeminder integration in a prominent way, which would really help increase our audience. I don’t want to irritate folks on the other side–I’m “a person on the other side” to a lot of folks–but beyond being a friendly dude, I want to make sure I don’t reduce the chances of spreading Beeminder to a bunch of new folks who likely wouldn’t hear about us otherwise.

Now, why would using an undocumented API potentially irritate folks on the other side? A lot of companies don’t expose the data Beeminder users want except in a “live” way. I don’t know if there are better terms for this, but one of the ways you can categorize our third party autodata is if it’s critical that we fetch data at the deadline. Strava, for instance, gives us the start and end datetimes of each session, and it isn’t intrinsic to the API that we sync right at the deadline. Project Euler, on the other hand, only gives us “the current number of points”. If we sync 30 minutes after the deadline, there’s no real way for us to know what the value was at the deadline. For those integrations, we have to sync as close to the deadline as we possibly can. Many folks have deadlines at local midnight, and there are a few timezones that have many many many goals for the same integration. 10k API calls to the same provider in as small of a time period as we can? As my 8YO says, “we look sus!” (Beyond looking suspicious, the system load for 10k near-simultaneous API calls can be intense, depending on what it’s doing and how they’re set up, and my heart aches for the poor engineer on the other side. <3)

(For the Strava type integrations, we do still sync as close to deadline as we can, but if we had to spread them out over an hour or something, it could be done, you know?)

The not-wanting-to-irritate-folks then feeds back into the “trying to reduce autodata maintenance” too, because it’s easy for someone on the other end to purposely make it tougher for us or just to tell us we’re not allowed in some other way.

(OTOH, when I was just a beeminder user, I wrote some integrations that the third party company would have been … less than pleased… had they known about them. I remember one, I tore apart an Android APK and put in mitmproxy (and probably Frida, I forget the exact details) and got everything so I could pretend I was the Android app. gazes wistfully I don’t use it anymore for other reasons, but it’s been nearly a decade and they’re still saying they’re hoping to come out with a user API in the next quarter.)

I do have “improve user-built integrations” on the list (not at the exact top, but I still like getting feedback and ideas regardless). The thing that I wanted the most when I wrote a bunch of custom integrations was a day-bucketed idempotent … upsert, almost? I wanted a way to say “here is a real-world time, a value, maybe a comment” and have Beeminder figure out which “day” that corresponds to, per any custom deadline, and then look at the value, and the aggregated daily value for the goal, and if the value would change the aggday’ed value, to either add the new datapoint to the day, or to update the most recent datapoint for the day to the new datapoint. I wanted this so badly, and yet I don’t really get many “oh yeah, we want that!” when I bring it up now. I see a lot of user integrations where the authors don’t want to add state, so they either add a datapoint regardless, leading to days on end of 48 datapoints with the same value, or they have to ask Beeminder what the last values are and then figure it out themselves. (Sometimes they ask for years of their goal’s history, every single time, which isn’t necessarily great for us.) I get it, I do, so I’m not really grumpy about it, but I would like to make it trivial to make a much better integration.

Among other things, I’d also like to improve the DX for having Beeminder asking user integrations for data when Beeminder wants it, have good sample user integrations at Val Town and replit and whatever else, and someday make it easier to promote user integrations to official ones… If there’s anything in particular that’d help, I’m all ears!

Oh, clouedoc, I suspect you’re massively more on top of scraping than I am. I’d love to pick your brain sometime about some Cloudfront and Cloudflare issues we’ve been seeing in autodata…

5 Likes

That’s cool, I didn’t think Beeminder had something like that inside !

(this is a super cool hacker move too :sunglasses:)


This :point_up_2:

And this :point_up_2:

Makes me think that we almost have the same job :laughing:


Feel free to contact me for both the Cloudflare/Cloudfront issues and the credit card problem that dreeves talked about in the beemails :eyes:
I am not nearly on top of my scraping game as I wish, but I do have experience with Cloudflare scraping, so I probably can nudge you in the right direction :smiley:


Maybe the reason is that lots of custom goals are beenary ones? So you can insert every hour and use cap1 and be alright ?

(I only automated one goal manually though)


What all of it makes me think is, if Beeminder is indeed attracting tons of users due to integrations (I know I signed up due to Complice), then why not building tons and tons of integrations in the fastest amount of time possible? Will it increase the maintenance burden too much? If so, why not trying to find a way to put the responsibility on a few users? I’m sure there are a few devs here who might be happy maintaining their favorite auto-data integration for other users.

Well, I already know. It’s complex, and costs time, which is better spent elsewhere :eyes:

3 Likes

Hiya folks,

The Readwise Reader integration is in beta/preview. It’s not officially launched yet but you can find it at beeminder dot com slash readwisereader (don’t link to it till it’s launched!).

We’d love to get your thoughts and especially bug reports!

4 Likes

“too many requests to readwise reader” :scream_cat:

Seems tricky to check counts of inbox/later/shortlist without triggering this error, and no apparent way of continuing once it happens. Both times I’ve had to start over and re-enter my auth token.

2 Likes

Great news! Are there plans to give an option similar to Pocket integration where you beemind the number of articles read, rather than a whittle-down goal?

2 Likes

You should be able to just wait a moment and try again – is that not working?

2 Likes

Nope, the fetch count button stays greyed out indefinitely, and refreshing the page means starting over with providing the readwise token.

Just tested again and it seems that toggling between types of count (inbox, etc) reenables the button.

2 Likes

Hmm, so it should work to fetch the count of another section. Is there a use case for needing to be able to instantly re-fetch the same data you just fetched? :thinking: I don’t really understand why that would be needed, but I’m not a Readwise user myself so perhaps I’m missing something.

I think it’s a hard limitation to avoid rate-limiting, so there may be no good workaround, but @adamwolf might be able to say more.

2 Likes

Um, it didn’t fetch, just gave that error banner.

PS: Although I’m a fan of readwise and the reader, for this I’m just being a helpful beta tester because I have zero practical use for this kind of integration.

For me, the purpose of saving articles ‘for later’ isn’t actually to read them, it’s to retain the option of reading them and free up time. Don’t need yet another backlog, though I suppose a do-more goal would help ensure that I keep using that option instead of going down a rabbit hole of reading stuff in the moment.

2 Likes

Ah, I think I see why we were talking at cross-purposes there – the button gets greyed out if you check that section and get an answer, but also if you get rate-limited, and it doesn’t seem to re-enable unless you change categories and change back. Does that sound right?

I only remembered it greying out after a specific fetch, so thought you’d be able to wait and hit the button again without toggling. That’s probably something there’s some way to improve, but I don’t know how myself. Re-enabling the button after a minute? But how to make it obvious that’s going to happen… :thinking:

2 Likes

Correct. Without knowing what the rate limit actually is, I suspect we’ve been overly cautious and restrictive.

But yes, reenabling the button automatically should work, but probably after small number of seconds rather than a minute.

2 Likes