I've been using my reMarkable 2 a lot more recently, and have gotten started with actually hacking on it. It's a bit overdue, since the main reason I purchased it in the first place was that it is built on top of Linux and doesn't require any special jailbreaking/rooting.
I found Adrian Daerr's script to import PDFs/EPUBs into a reMarkable, which is surprisingly not a straightforward operation.
You need to rename the file to use a UUID as its name, create corresponding .metadata and .content files, and then empty .cache, .highlights, and .thumbnails directories.
Daerr's bash script does all of this, except it runs on a different machine, and then scps the files over to the reMarkable. Modifying it to run on the reMarkable itself didn't seem too complicated, but I try to avoid writing shell scripts as much as possible, so I took the opportunity to port it to Rust.
I first asked Claude to port it to Rust, and, probably for the first time, I was disappointed by the result.
I couldn't come up with a reason on why Claude would insert a comma after the equals sign (it's not really a hallucination I think?), but rust-analyzer flagged it as a syntax error right away.
I deleted most of that code anyways since I wanted to unconditionally restart, and also use camino instead. As an aside, std::path represents paths with OsString, which is incredibly inconvenient to use anywhere else, which'll expect normal UTF-8 Strings. camino only supports paths that are fully UTF-8 (aka String instead of OsString), which should be fine for most projects that don't need to support legacy files and encodings, like this one.
Next, I had to cross-build it for the reMarkable's ARM v7 CPU. I've done it before for Raspberry Pis, but since it's been a while, I wanted to try out the cross tool, which transparently builds in a container with the necessary toolchains. And if you set a little bit of metadata, it's as simple as cross build --release.
To make the newly imported file actually show up in the reMarkable file listing, you apparently have to restart the entire thing, which does work, but surely there's a better way to tell it to look for new files...
Finally, to actually make use of it, I set up rclone to automatically fetch a folder from my Nextcloud instance, and then run rm-import over it. And now I can drop a PDF in a dedicated Nextcloud folder, and it'll end up on my reMarkable!
Over the past month, Freedom of the Press Foundation has received significant interest in newsrooms setting up SecureDrop. Our open source whistleblower submission system is already used around the globe by large media organizations, small nonprofit newsrooms, and everything in between. We’re excited to see more adoption of SecureDrop.
To help newsrooms better understand both what makes SecureDrop special, as well as what it takes to operate it, we’ve published a guide highlighting five things to know; check out the full post on the SecureDrop blog.
When we walked in, they had a sign for their New Year special: a camellia ruby pomelo tea. I'm a big fan of pomelo, or પપનસ in Gujarati, since we regularly ate it as kids. If you haven't tried it before, it's similar to a grapefruit, but better. And as I just learned, pomelo is also part of Lunar New Year celebrations. Here's the entire tea description on the menu:
Red pomelo is more than a fruit, it's a celebration of the New Year. Its vibrant red symbolizes abundance and togetherness, while its bright, tangy sweetness bursts with freshness. Subtle notes of camellia and osmanthus add elegance, blending festive joy with the warmth of home. Fresh yet unique, it redefines the pomelo experience.
A vibrant and citrusy drink featuring freshly brewed Taiwan camellia oolong tea, juicy seasonal Florida ruby pomelo, and a handcrafted natural plant-based osmanthus jelly. Hand-peeled pomelo segments add a delightful burst of freshness to this floral and aromatic blend.
As I've mentioned before, I much prefer milk teas, but since this was a special, limited edition drink I was willing to give it a try. And, it paid off.
Boba: 4/4 perfect chewiness and sweetness. The jelly was a nice complementary texture in between the boba and the pomelo pieces.
Tea: 4/4 it tasted exactly like the description: pomelo juice with subtle amounts of oolong tea. I've not enjoyed lemon teas in the past, so I was genuinely surprised at how much I liked this.
Bonus: 1/1 it was not well advertised, but they do have a privacy-friendly stamp card! It took a minute for one of the workers to find the cards when I asked, so probably not enough people take them up on it.
Total: 9/10. We have our first complete score! It is incredibly well deserved, it sounds cheesy but for a few hours after I finished the tea I was telling my girlfriend, Kajol, that I couldn't stop thinking about the tea and wanted more. Speaking of Kajol, she ordered a "BOBO milk tea" (brown sugar boba) with light ice. By default it came with lactose-free milk.
Boba: 4/4 good amount of QQ, good flavor
Tea: 4/4 tea flavor is good, perfect amount for her (not too strong, not too mild, not too sweet)
Bonus: 1/1 the place is aesthetic and it was nice that they had different lactose free milk options. We had to order on a self-checkout kiosk, but there are interesting and different options from other places. The container was cute but she wished it was bigger.
Before we total up the score, we need to discuss what happened with the boba cups:
Biggest regret: not taking a better picture of the teas right after we bought them.
There was a minor accident and my tea cup was dropped right as we entered my apartment. The bottom cracked so I dumped the tea into the closest jar to me, salvaging nearly all of it. On the other hand, Kajol's tea came in quite a robust plastic mason jar that didn't break. It definitely is small compared to what you normally get at other boba shops.
Back to the total score: 9/10, another complete score!
As I had explained when I first laid out the rating system, the tenth and final point is for consistency. After earning a 9/10, I'll go back and if keeps up the same level of quality, then the score will be increased to a perfect 10/10.
tl;dr: A new browser extension allows you to automatically export Claude transcripts to Markdown. You can install it for Firefox.
Claude is the primary LLM I use these days, but they don't have a builtin way to share your sessions, which I find pretty useful to learn from. Simon Willison had previously posted a notebook with code to convert a JSON response to a nicely formatted Markdown transcript. But the process was pretty cumbersome, you need to open up the network console, find a specific request, and then copy the JSON out of it. But on a technical level, that should be pretty straightforward to automate...right?
I asked Claude, of course, and it created a WebExtension that automatically grabbed the specific JSON response necessary, and displays it to the user. I plugged in Simon's code to turn it into markdown, and huzzah!
When you reload the tab with Claude in it, or select a different conversation, their frontend will send a request with the full JSON contents, which the extension intercepts and stores for display in the popup. It doesn't (yet) support live updating as you send new messages or replies come in.
As a bonus, I had Claude add functionality to upload the transcript as a GitHub Gist. So you can see the full transcript of the conversation used to create the extension, uploaded by itself.
This is not a super novel idea, there are other extensions in the Firefox and Chrome stores that puport to have similar functionality, but I didn't immediately find any open source ones. I also wanted to refresh my knowledge on WebExtensions; it's been seven years since I last created one.
Overall I'd estimate Claude turned something that would've taken me ~5 hours to do from scratch into a 1-2 hour project, and even then most of that time was spent manually testing and verifying the functionality versus actually writing code. The original version was not perfect, I had to make some changes like adding a content-security-policy and removing extraneous permissions. Unsurprisingly it used manifest_version 2 instead of the newer v3, even though all the code it created was compatible with the v3 requirements.
I hope this is useful for others, you can install it in Firefox and browse the source code. In theory it should be compatible with other browsers, but I haven't tested it; the .zip bundle with the extension is uploaded as a release.
As part of Boba Quest 2025 🧋, I'm trying and reviewing a new boba shop each week.
The first month of Boba Quest is in the history books and it has been way more fun than I anticipated. The only thing better than trying new boba is trying new boba and then talking about it with your friends.
Really the only part I didn't do a good job on was geographic variety; all the places I reviewed were in Queens, off the 7 train. I promised that this week I would venture out, and venture out we did!
This week we tried AKIHI Bubble Tea, all the way in Newark, New Jersey.
Yes, you read that right, New Jersey. Boba Quest has officially crossed state lines into the Garden State.
This was another group review, with my sister, Rayna, and my girlfriend, Kajol. I am starting to appreciate group reviews more because you can gain a better impression of a boba shop by trying multiple drinks.
Before we get to the drinks, we need to talk about the ordering process. AKIHI had a touchscreen that you could order from, but it was organized pretty confusingly. The categories were "Popular", "Limited time", "First time here", "I know this place", and so on, instead of the usual categories like milk teas, fruit teas, slushes, etc.
Once you conquer the confusing menu and order, they have a nice seating platform that isn't blurry in real life (my bad).
Our other critique was that there were no "plain" fruit teas, they were already mixed. For example, there was a pineapple-mango tea, but no tea with solely mango.
It wasn't all bad; one major positive was that lactaid and other non-dairy milk options were available at no extra cost.
Okay, let's get to the drinks!
I ordered a jasmine milk tea with boba, 100% sweetness, and less ice.
Boba: 3/4 good chewiness but could've been a tad bit sweeter.
Tea: 2/4 not sweet enough, otherwise decent.
Bonus: 1/1 I was happy because of no extra cost for non-dairy options and the ambiance is nice to sit and work; but the menu was confusing.
Total: 6/10: Overall it was decent, but I would want to try out other places around Rutgers before coming back here.
Kajol ordered a brown sugar brulee with boba, 100% sweetness, and less ice.
Kajol's far more asthetic picture of her boba.
Boba: 4/4 it's chewy, it's QQ!
Tea: 3/4 it's good, but quite sweet.
Bonus: 1/1 I liked the ambiance and the vibes. And liked the cups.
Total: 8/10.
Rayna ordered a bubble milk tea, 70% sweetness, less ice, and lactaid milk.
Boba: 4/4 I liked how chewy it is
Tea: 2/4 I wanted it to be more flavorful :(
Bonus: 1/1 I don't like how the menu is organized, but they can have the point for having both lactaid and dairy-free options.
Total: 7/10.
I (Kunal) tried all three drinks and need to say that their sweetness levels were entirely out of sync. Kajol and I both asked for 100% sweetness, but hers was significantly more sweeter than mine. And the supposed 30% difference between mine and my sister's drink felt closer to 50%. Certainly this is a good argument for continuing with group reviews and ordering multiple drinks.
No idea where the next review will take place, but I'll try to keep it within the New York City limits this week :-)
Editor's note: the following is a guest post from my sister, Rayna, about the "Cannoli Crawl" we did this past weekend. —Kunal
My friends are often surprised to find out that cannoli are one of my favorite desserts. In their defense, I talk about ice cream far more frequently. Still, I'm always on the lookout for cannoli when eating at Italian resturants and am often left disappointed. I had some fantastic cannoli in Philadelphia last November, so it was fresh on my mind when planning out this weekend's visit to New York City.
I spent the last week searching different Reddit threads and food blogs to compile a list of the most-loved cannoli in the city. I was naively expecting most of them to be in Little Italy, but the recommendations included one place in The Bronx and a few deep in Brooklyn. We only made it to four of the places on the list, which means there are still more places to visit next time.
The rating system is not as detailed as Kunal's Boba Quest but we did our best to detail our likes and dislikes. Along for the journey were Kunal's girlfriend, Kajol, and her sister, Mannat. Unfortunately, while all of the places we tried had nut-free cannoli options, they wouldn't guarantee that they were nut-allergy safe because of possible cross-contamination. As a result, it's mostly thoughts from myself, Kunal, and Mannat.
Our first stop: La Bella Ferrara in Little Italy, which had a good selection of mini- and regular-sized cannoli. Flavors included tiramisu, cookies and cream, red velvet, and more, but we started with the original to keep it simple.
Rayna: 8/10 I liked the sweetness of the filling and the variety of the options available. I appreciated that the chocolate chips were spread throughout the filling, but wanted more of them.
Kunal: 8/10 My biggest complaint was that the shell fell apart in my hands as soon as I took a bite.
Mannat: 9/10 My first-ever cannoli, I was very happy with the new dessert. I also wanted more chocolate chips.
Overall, a really promising start to the Cannoli Crawl!
Rayna, hazelnut flavor: 5.5/10 The hazelnut flavor was good, but the pastry shell was unimpressive. There were also not enough chocolate chips, but they get half a point back because the cannoli were served with powdered sugar. Kunal is unhappy I am awarding half points, but it's my blog post so I make the rules.
Kunal, original: 6/10 The flavor was eh and the shell broke while eating.
Mannat, cookies and cream: 6/10 It just tasted like cream with crushed cookies on the outside — the flavor wasn't consistent. The shell also wasn't good, but the powdered sugar was nice.
Overall, we were unimpressed. :(
Around the corner was our third stop: Ferrara Bakery and Cafe, where they only had regular and chocolate dipped shells, so we all chose the former. Kajol took a bite of this one, so her review is included too.
Rayna: 8/10 I liked the cream and the pastry shell, but this one was severely lacking in chocolate chips — I think I got four in my entire cannoli. They also only had one size, unlike the previous two places which had mini and regular options.
Kunal: 7/10 This was the best cream so far but the shell broke apart too fast.
Mannat: 7/10 Agreed that this was the best cream so far but I wasn't a fan of the shell — it was too crumbly and needed more flavor. It also needed more chocolate chips.
Kajol: 9/10 The cream and shell were both pretty good but they lose a point for not having enough chocolate chips.
For our last stop, we went to Pasticceria Rocco in the West Village. These were the only cannoli to be filled fresh, the effect of which is easily apparent in our ratings 😅. With only one size available, they had two options for the ends: dipped in chocolate chips or crushed pistachios. We all opted for chocolate chips.
Rayna: 10/10 The flavor was fantastic, along with the amount of chocolate chips on the ends. The shell was also the right texture and didn't fall apart. It would have been nice if the chocolate chips went throughout but the fresh filling was the star and made up for any shortcomings.
Kunal: 9/10 This was easily the best of the day; the cream was fresh and the shell didn't instantly fall apart in my hands.
Mannat: 10/10 This was great but I still liked the first one best.
At this point we were out of time and also cold, so we passed on the original plan of also visiting two spots in Brooklyn and one in Astoria — we'll save those for next time.
All in all, the Cannoli Crawl was a success. Pasticceria Rocco is our clear favorite, while Caffe Palermo was the biggest letdown. I am extremely content with how we spent our afternoon and my cannoli craving has been satisfied, for now.