How to install .NET Core on your Remarkable 2 e-Ink tablet with Remarkable.NET
I blogged about The quiet rise of E Ink Tablets and Infinite Paper Note Takers - reMarkable 2 vs Onyx Boox Note Air and my love for the Remarkable 2 e-Ink tablet.
Now I see that Colby Newman is working on a .NET API for the Remarkable series of tablets. As you know, Dear Reader, I will install .NET on anything and everything so this is right up my alley. The NuGet Package is Remarkable.NET and the GitHub is at https://github.com/parzivail/ReMarkable.NET
.NET Core is open source and cross platform and Remarkable.NET is build on .NET Core 3.1 which has binaries for ARM32 which sets us up nicely for use on the Remarkable tablet.
I can download the build here https://dotnet.microsoft.com/download/dotnet/3.1
On my Remarkable I can go to Settings | Help | Copyright and Licenses to see my IP address and SSH root password.
Now I can scp and ssh firstname.lastname@example.org and enter the password. Note that ssh and OpenSSH is built into Windows 10 so you don't need to install putty or WinSCP but feel free if it makes you happy. Just a reminder though that Windows has OpenSSH or you can use WSL on Windows 10.
After downloading .NET Core 3.1 to my local machine I use scp to copy to /home/root then I ssh into the Remarkable Tablet. Of course, your IP will be different.
scp .\dotnet-sdk-3.1.411-linux-arm.tar.gz email@example.com:/home/root
Now, per their docs, from my ssh session on the Remarkable, I unzip dotnet and mark it as executable.
tar xzf dotnet-sdk-3.1.411-linux-arm.tar.gz -C ./dotnet
chmod +x ./dotnet/dotnet
Fantastic. This is an amazing project. There's even an emulator that uses OpenTK to draw, so I can test locally.
The docs sample code is very idiomatic .NET. Nice stuff. For example:
// Create an image
var img = new Image<Rgb24>(300, 300);
// Do some image processing
img.Mutate(ctx => ctx.DrawLines(Color.Black, 3, new PointF(50, 50), new PointF(250, 250)));
// Draw the image to the screen
OutputDevices.Display.Draw(img, img.Bounds(), Point.Empty);
// Exit when home button is pressed
InputDevices.PhysicalButtons.Pressed += (sender, button) =>
if (button == PhysicalButton.Home)
This is very easy to read.
If your are ssh'ed into your Remarkable 2, you can start|stop the main Remarkable interface with
systemctl start|stop xochitl
You may want to do this when running apps ssh'ed in. There's also a community repository of free software for the Remarkable called Toltec. It's like homebrew or winget or apt get for Remarkable. And the dotnet runtime is already in the Toltec listing, which is cool.
Thanks to TheRealShodan on Twitter for their help with this thread. They said:
I’m not going to lie the UX for new people isn’t perfect. Basically a new version dropped whilst the Toltec devs were mid re-architecture. Step one backup your root password and drop on a key!
2. Install Toltec but use the testing repo. Stable basically doesn’t work - I have already queried the nature of ‘stable’
3. Install the display package. This include r2fb which is a lib with hooks that make rm1 apps work on rm2. The community has kinda standardised on using the rm1 display API.
4. Install the display package. This include r2fb which is a lib with hooks that make rm1 apps work on rm2. The community has kinda standardised on using the rm1 display API. (Ed. Note. Nice to know .NET 5 works also!)
5. Build the remarkable.net sandbox binary as Release/ARM. Copy to device and run with rm2fb-client dotnet Sandbox.dll
6. At this point you will see that it doesn’t work as I haven’t put my PR in. You can try to fix by changing HardwareTouchscreenDriver construction in the lib
7. To see anything on screen you’ll have to go through my ramblings on discord. Basically find the DllImport references to libc and change this to point to /opt/lib/librm2fb_client.so.1.0.1
Also, to run your app shutdown xochitl otherwise they’ll both fight over the display and make a mess. Ideally you would use a launcher to manage that but as I’m just debugging I run from CLI. Don’t disable xochitl, that way a reboot will fix anything bad.
I'm still exploring but I'm enjoying the ride! (as always, no warranty express or implied!)
NOTE: If you mess up your remarkable messing around with Toltec or think you Bricked it (again, don't complain to me, please) you can connect it with USB and
ssh firstname.lastname@example.org and once you are there, there is a great thread here on how to uninstall Toltec.
Have fun, be safe.
Sponsor: Pluralsight helps teams build better tech skills through expert-led, hands-on practice and clear development paths. For a limited time, get 50% off your first month and start building stronger skills.