Skip to content
Merged
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
51 changes: 51 additions & 0 deletions site/blog/My updated read-it-later flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<post-metadata>
<post-title>
My updated read-it-later flow
</post-title>
<post-date>
2026-03-03
</post-date>
<post-tags>
</post-tags>
</post-metadata>

------

### Moving on from Pocket

Personally, it feels like I'm still in mourning for Pocket. I had a pretty nice setup going when it was still operational;

- A Self-Hosted FreshRSS instance.
- An [accepted feature request](https://github.com/FreshRSS/FreshRSS/discussions/6878) to fire events when articles are starred.
- A [custom plugin (rip)](https://github.com/huffstler/xExtension-StarToPocket) that I forked to send those starred articles directly to Pocket.
- The [RSS App](https://github.com/ReadYouApp/ReadYou), which I do all my reading on.

But those middle parts are gone now... At least the part where I star articles on my phone and they go to Pocket. I was sad and waffling about whether I wanted to self-host something like Wallabag or whatever. I don't like being responsible for keeping things operational, unfortunately, so I was definitely dragging my feet making a decision there. At the same time I was experiencing a different little frustration with my RSS workflow:

> How do I send things that don't have RSS feeds to my reader?

My phone reader is great when reading things that I'm already following... but what if I come across something that's not already there? How do I get that into my "readflow"? (Combo of workflow and reader. I know, very creative.)

### The new shiny

Enter a [small, overlooked submission on HackerNews](https://news.ycombinator.com/item?id=47111280) touting [RSS Librarian](https://github.com/thefranke/rss-librarian). It's a stupid simple idea: provide a target to send links to that adds those links to an RSS feed. You then subscribe to that RSS feed with your reader of choice and you end up with a "Read-it-later" RSS feed! How cool is that?!

Not only is it a good idea, the execution is pretty great too, if you ask me. It's a single small php file and there are no "accounts" that you need to log in to to use it. It assigns a 64 character hash when you use it for the first time. As long as you keep that hash private you have the endpoint to send whatever links you want to read later. It's pretty much exactly what I was looking for.

### The "last mile" problem

There's a bookmarklet generated for you on your Librarian "homepage" which allows you to send whatever page you're on to your "account". It works great when you're using a regular computer, but I wasn't able to get it to work with my phone browser (Firefox). Blegh.

What's the easiest way possible to get a link from a phone to somewhere else? I think it's the 'Share' feature on the phone. Only three clicks from Firefox. Do I want to develop an entire android app for this? Absolutely not. Are there ways to have custom share targets? As it turns out, yes, but more on that in a couple sentences.

I also need the ability to send dynamically generated GET requests to a static url. Is there something I can use to combine my two requirements into one need-fulfilling tool?

[Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm). Tasker can do all of that (and way more, but I have no need for the extra features at this moment).

Tasker has a custom "share receiver" which I use to grab the url from a webpage and send a GET request to my "account" on RSS-Librarian. Everything works flawlessly (as long as it keeps running in the background), so now I can send links to a personal read-it-later rss feed from any of my devices!

### Things to note

Librarian does have a limit of 25 items per feed before it starts truncating, but that's not a big deal as I've set up FreshRSS to keep all articles from Librarian indefinitely.

If you're missing Pocket, and don't want to have the responsibility of self-hosting yet-another time sink, this seems like a great choice!
1 change: 1 addition & 0 deletions site/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ window.onload = function () {
"If you're gonna be dumb, you gotta be tough",
"Effort spent is never effort wasted",
"It's your life; live it",
"I love it... I hate it... I would burn the whole thing down and build something exactly like it."
];

function getQuote() {
Expand Down
246 changes: 246 additions & 0 deletions site/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
/* Patura.css v1 forked from sakura-forest theme
* ================
* Minimal css theme.
* Project: https://github.com/oxalorg/sakura/
*/
/* Body */
html {
font-size: 62.5%;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
background-color: #FCF5E5
}

body {
font-size: 1.8rem;
line-height: 1.618;
max-width: 38em;
margin: auto;
color: #001F0E ;
background-color: #FCF5E5;
padding: 13px;
}

@media (max-width: 684px) {
body {
font-size: 1.53rem;
}
}
@media (max-width: 382px) {
body {
font-size: 1.35rem;
}
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.1;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
font-weight: 700;
margin-top: 3rem;
margin-bottom: 1.5rem;
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
word-break: break-word;
}

h1 {
font-size: 2.35em;
}

h2 {
font-size: 2em;
}

h3 {
font-size: 1.75em;
}

h4 {
font-size: 1.5em;
}

h5 {
font-size: 1.25em;
}

h6 {
font-size: 1em;
}

p {
margin-top: 0px;
margin-bottom: 2.5rem;
}

small, sub, sup {
font-size: 75%;
}

hr {
border-color: #007559;
}

a {
text-decoration: none;
color: #007559;
}
a:visited {
text-decoration: blink
color: #004232;
}
a:hover {
color: #006994;
border-bottom: 2px solid #222222;
}

ul {
padding-left: 1.4em;
margin-top: 0px;
margin-bottom: 2.5rem;
}

li {
margin-bottom: 0.4em;
}

blockquote {
margin-left: 0px;
margin-right: 0px;
padding-left: 1em;
padding-top: 0.8em;
padding-bottom: 0.8em;
padding-right: 0.8em;
border-left: 5px solid #007559;
margin-bottom: 2.5rem;
background-color: #f7f7f7;
}

blockquote p {
margin-bottom: 0;
}

img, video {
height: auto;
max-width: 100%;
margin-top: 0px;
margin-bottom: 2.5rem;
}

/* Pre and Code */
pre {
background-color: #f7f7f7;
display: block;
padding: 1em;
overflow-x: auto;
margin-top: 0px;
margin-bottom: 2.5rem;
font-size: 0.9em;
}

code, kbd, samp {
font-size: 0.9em;
padding: 0 0.5em;
background-color: #f7f7f7;
white-space: pre-wrap;
}

pre > code {
padding: 0;
background-color: transparent;
white-space: pre;
font-size: 1em;
}

/* Tables */
table {
text-align: justify;
width: 100%;
border-collapse: collapse;
margin-bottom: 2rem;
}

td, th {
padding: 0.5em;
border-bottom: 1px solid #f7f7f7;
}

/* Buttons, forms and input */
input, textarea {
border: 1px solid #222222;
}
input:focus, textarea:focus {
border: 1px solid #007559;
}

textarea {
width: 100%;
}

.button, button,
input[type=submit],
input[type=reset],
input[type=button],
input[type=file]::file-selector-button {
display: inline-block;
padding: 5px 10px;
text-align: center;
text-decoration: none;
white-space: nowrap;
background-color: #007559;
color: #ffffff;
border-radius: 1px;
border: 1px solid #007559;
cursor: pointer;
box-sizing: border-box;
}
.button:hover, button:hover,
input[type=submit]:hover,
input[type=reset]:hover,
input[type=button]:hover,
input[type=file]::file-selector-button:hover {
background-color: #006994;
color: #ffffff;
outline: 0;
}

.button[disabled], button[disabled],
input[type=submit][disabled],
input[type=reset][disabled],
input[type=button][disabled],
input[type=file][disabled] {
cursor: default;
opacity: 0.5;
}
.button:focus-visible, button:focus-visible,
input[type=submit]:focus-visible,
input[type=reset]:focus-visible,
input[type=button]:focus-visible,
input[type=file]:focus-visible {
outline-style: solid;
outline-width: 2px;
}

textarea, select, input {
color: #222222;
padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
margin-bottom: 10px;
background-color: #f7f7f7;
border: 1px solid #f7f7f7;
border-radius: 4px;
box-shadow: none;
box-sizing: border-box;
}
textarea:focus, select:focus, input:focus {
border: 1px solid #007559;
outline: 0;
}

input[type=checkbox]:focus {
outline: 1px dotted #007559;
}

label, legend, fieldset {
display: block;
margin-bottom: 0.5rem;
font-weight: 600;
}

Loading
Loading