Skip to main content

Generate and deliver a daily newspaper PDF

Project description

a daily newsfeed delivered to your remarkable tablet

PyPI

Docker Hub Automated Build GitHub Container Registry Automated build

GitHub Workflow Status (with branch) Codecov

what's up

goosepaper is a utility that delivers a daily newspaper to your remarkable tablet. that's cute!

you can include RSS feeds, Mastodon feeds, news articles, wikipedia articles-of-the-day, weather, and more. I read it when I wake up so that I can feel anxious without having to get my phone.

survey

[New!] In response to feedback, I'm collecting anonymous survey responses. Do you want a goosepaper delivered but without requiring any code? Please let me know your thoughts!

get started with docker

By far the easiest way to get started with Goosepaper is to use Docker.

step 0: write your config file

Write a paper config file to tell Goosepaper what news you want to read. An example is provided in example-config.json.

step 1: generate your paper

From the directory that has the config file in it, run the following:

docker run -it --rm -v $(pwd):/goosepaper/mount j6k4m8/goosepaper goosepaper -c mount/example-config.json -o mount/Goosepaper.pdf

(where example-config.json is the name of the config file to use).

step 2: you are done!

If you want to both generate the PDF and deliver it to your reMarkable tablet, pass --deliver. You must additionally mount your ~/.rmapi file:

docker run -it --rm \
    -v $(pwd):/goosepaper/mount \
    -v $HOME/.rmapi:/root/.rmapi \
    j6k4m8/goosepaper \
    goosepaper -c mount/example-config.json -o mount/Goosepaper.pdf --deliver

Otherwise, you can now email this PDF to your tablet, perhaps using ReMailable.

get started without docker: installation

dependencies:

this tool uses weasyprint to generate PDFs. After installing the system prerequisites below, sync the project environment with uv sync.

more details here.

Goosepaper now targets Python 3.12+.

mac:

brew install cairo pango gdk-pixbuf libffi

ubuntu-flavored:

sudo apt-get install build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info

windows:

Follow these instructions carefully.

and then:

From inside the goosepaper repo,

uv sync

Then run Goosepaper through uv:

uv run goosepaper --config myconfig.json --output mypaper.pdf

get started

You can customize your goosepaper by editing a paper config file. If you do not pass --config, Goosepaper looks for ./goosepaper.json.

uv run goosepaper --config myconfig.json --output mypaper.pdf

If you don't pass an output flag, one will be generated based upon the time of generation.

The paper config uses a strict v2 schema with one file per paper. A minimal example looks like this:

{
  "version": 2,
  "paper": {
    "style": "FifthAvenue",
    "font_size": 14,
    "table_of_contents": true,
    "layout": "auto",
    "page_profile": "remarkable2"
  },
  "sources": [
    {
      "type": "rss",
      "url": "https://feeds.npr.org/1001/rss.xml",
      "limit": 5,
      "byline": "first",
      "body_source": "auto"
    },
    { "type": "reddit", "subreddit": "news" }
  ],
  "delivery": {
    "folder": "Morning Brief"
  }
}

style selects a visual theme. layout controls the overall column density: with "auto", Goosepaper defaults to a single reading column on narrow device profiles like remarkable1, remarkable2, and paper_pro_move, and to denser multi-column pages on larger profiles like paper_pro, letter, and a4. If you want to force it, set "layout": "1col", "2col", or "3col". If you want a linked contents block near the top of the issue, set "table_of_contents": true in the paper object. If you want to override the body typeface without taking over the whole design, set "body_font": "Literata". If you want to target a specific device or paper shape, set "page_profile" to one of remarkable1, remarkable2, paper_pro, paper_pro_move, letter, or a4. ("rm1" also works as a short alias.) RSS sources can also set "byline": "all", "none", or "first", plus "body_source": "auto" | "content" | "summary" | "article". Bluesky sources can set "include_replies": true | false. Weather sources can set "mode": "summary" | "hourly" | "daily" | "hourly_daily" plus hours, step_hours, days, and clock_format for richer forecasts.

Delivery still happens only when you pass --deliver. If you want user-level delivery defaults, create ~/.config/goosepaper/config.json:

{
    "version": 2,
    "delivery_defaults": {
        "folder": "News",
        "replace_mode": "nocase",
        "cleanup": true
    }
}

CLI flags override the config for a single run:

uv run goosepaper --deliver --folder Inbox --replace-mode exact

An example config file is included here: example-config.json.


Check out this example PDF, generated on Nov 1 2020.

existing story providers (want to write your own?)

More Questions, Infrequently Asked

yes but pardon me — i haven't a remarkable tablet

Do you have another kind of tablet? You may generate a print-ready PDF which you can use on another kind of robot as well! Just remove the last line of main.py.

very nice! may i have it in comic sans?

yes! you may do anything that you find to be fun and welcoming :)

If you want a real override, set paper.body_font in your paper config and let the rest of the layout and typography engine keep doing its job.

do all dogs' names start with the letter "B"?

I do not think so, but it is a good question!

may i use this to browse twitter?

yes you may! you can add a list of usernames to the feed generator and it will make a print-ready version of twitter. this is helpful for when you are on twitter on your laptop but wish you had Other Twitter as well, in print form.

no! twitter has changed and now no one can play nicely with them. sorry! it is sad!

You May Also Like...

  • remailable: Email PDF documents to your reMarkable tablet
  • remarkapy: My Python client for the reMarkable cloud API, which powers the upload functionality of Goosepaper

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goosepaper-0.8.1.tar.gz (48.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

goosepaper-0.8.1-py3-none-any.whl (56.6 kB view details)

Uploaded Python 3

File details

Details for the file goosepaper-0.8.1.tar.gz.

File metadata

  • Download URL: goosepaper-0.8.1.tar.gz
  • Upload date:
  • Size: 48.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for goosepaper-0.8.1.tar.gz
Algorithm Hash digest
SHA256 6201cab6665692e280da93aabdfeb67eaeb236be36967a47c6ac8dad4c13d05b
MD5 5422c177e4241f155d9d58f28e4b0ac3
BLAKE2b-256 df41e247dcb970abf08a22af9d34227cb9a5f82b7543e2ffa874c926102a5f08

See more details on using hashes here.

File details

Details for the file goosepaper-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: goosepaper-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 56.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for goosepaper-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 be1545b04e7f8c902be66ddb4e2993d30b065f994aca3269d5eebc0ef8ff8938
MD5 5846c86ebf069f7399f56a03aaab57b2
BLAKE2b-256 6cb5261b00a78006494490f275cab2251f295f31284c0b7858e66162ac46429c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page