yarr (yet another rss reader) is a web-based feed aggregator

yarr

yarr (yet another rss reader) is a web-based feed aggregator which can be used both as a desktop application and a personal self-hosted server.

It is written in Go with the frontend in Vue.js. The storage is backed by SQLite.

screenshot

usage

The latest prebuilt binaries for Linux/MacOS/Windows are available here.

macos

Download yarr-*-macos64.zip, unzip it, place yarr.app in /Applications folder. To open the app follow the instructions provided here or run the command below:

xattr -d com.apple.quarantine /Applications/yarr.app

windows

Download yarr-*-windows32.zip, unzip it, open yarr.exe

linux

The Linux version doesn't come with the desktop environment integration. For easy access on DE it is recommended to create a desktop menu entry by by following the steps below:

unzip -x yarr*.zip
sudo mv yarr /usr/local/bin/yarr
sudo nano /usr/local/share/applications/yarr.desktop

and pasting the content:

[Desktop Entry]
Name=yarr
Exec=/usr/local/bin/yarr -open
Icon=rss
Type=Application
Categories=Internet;

For self-hosting, see yarr -h for auth, tls & server configuration flags.

build

Install Go >= 1.16 and gcc. Get the source code:

git clone https://github.com/nkanaev/yarr.git

Then run one of the corresponding commands:

# create an executable for the host os
make build_macos    # -> _output/macos/yarr.app
make build_linux    # -> _output/linux/yarr
make build_windows  # -> _output/windows/yarr.exe

# ... or start a dev server locally
make serve          # starts a server at http://localhost:7070

# ... or build a docker image
docker build -t yarr .

credits

Feather for icons.

Comments
  • Issues on ARM

    Issues on ARM

    Tried building yarr for raspberry pi as per the instruction and got build successful however while try to run got the error:
    -bash: ./yarr: cannot execute binary file: Exec format error

    Then changed GOARCH=amd64 to GOARCH=armv7 in makefile and got issue(s) while build mkdir -p _output/linux GOOS=linux GOARCH=armv7 go build -tags "sqlite_foreign_keys release linux" -ldflags="-s -w -X 'main.Version=2.1' -X 'main.GitHash=f98de9a0'" -o _output/linux/yarr src/main.go cmd/go: unsupported GOOS/GOARCH pair linux/armv7 make: *** [makefile:21: build_linux] Error 2

    Guide me how to resolve this, thanks.

  • Old feed items reaapearing as unread occasionally

    Old feed items reaapearing as unread occasionally

    Hi 👋 Thank you for creating yarr. I've been using it for ages and it's wonderful! No other feed reader that I know of is so delightfully minimalistic and so easy to self-host thanks to the choice of SQLite and Go.

    I have a slight nuisance though with some feed items reappearing as unread from time to time in the reader. Note that the content of the items that reappear do not change (most of the time). They just need to be marked as read by hand. I'm sure other people experience that too and I'm curious what's the way avoid that and only see truly unread items in the reader.

    One cause that I've observed is when a RSS feed has <guid isPermalink=false> as e.g. at https://rss.art19.com/you-can-learn-chinese. In such case it's no wonder yarr doesn't try to guess whether an item is read or not because even the server doesn't guarantee whether it's a new item or not. Still, that translates to a suboptimal UX so maybe some workaround be acceptable? Generally, the feed item datetimes are correct, so a I was thinking of a per-feed setting like "do not show feed items older than some designated one". Perhaps there's a better solution. I'm curious to hear your thoughts.

    I have around ~250 feeds in my yarr instance and I'm experiencing the issue 3+ times a day.

    I should add I'm very much aware of https://github.com/nkanaev/yarr/issues/57 but I subjectively see this as an issue, not a new feature. You may have a different opinion of course.

    Best regards!

  • Nil pointer issue

    Nil pointer issue

    I tried running this service with more than 300 links and out of three times, it crashed twice.

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x89bd17]
    
    goroutine 24 [running]:
    github.com/nkanaev/yarr/server.findFavicon(0xc000406ba0, 0x1c, 0xc0002d1260, 0x29, 0x0, 0x0, 0x0)
    	/var/home/minioin/workspace/yarr/server/crawler.go:170 +0x5d7
    github.com/nkanaev/yarr/server.(*Handler).startJobs.func2()
    	/var/home/minioin/workspace/yarr/server/server.go:76 +0x3aa
    created by github.com/nkanaev/yarr/server.(*Handler).startJobs
    	/var/home/minioin/workspace/yarr/server/server.go:97 +0x149
    
  • Set auth without authfile

    Set auth without authfile

    With this patch, it is possible to pass username and password directly on the command line with:

    yarr --auth 'username:password'
    

    The corresponding environment variable comes handy with containers:

    YARR_AUTH='username:password' yarr
    
  • Pagination does not fetch the correct articles after some are marked as read

    Pagination does not fetch the correct articles after some are marked as read

    In the unread section, when you scroll down after reading a few articles some of them will not show up.

    I could take a shot at trying to fix it and I've thought of two ways this can be fixed.

    • The web-ui could request items from a specific offset (instead of by page), which would get decreased for each article read.
    • The web-ui could request items after the last item in the list, similar to how reddit handles pagination. This would to somewhat alter the query.

    Any thoughts as to which would be better, or maybe a different solution?

    Lastly, in rare cases the unread counter can go below 0. I haven't been able to reproduce it consistently and I don't know if it's related to this specific issue. Have you noticed that at all?

  • Suggestion: Keyboard Shortcuts

    Suggestion: Keyboard Shortcuts

    How would you feel about the idea of adding keyboard shortcuts? I find them very handy in NetNewsWire. Not asking you to necessarily do the implementation; more curious about your opinion of the capability.

  • Potential features in a branch

    Potential features in a branch

    Hi, I understand that #57 means the app is feature complete from your perspective.

    That said, I added some features in my branch and I thought it would be nice to at least point them here, in case there's something that interests you. I wouldn't mind making a PR for any of them:

    • Setting to enable/disable "Auto mark item as read"
    • "Mark all as read" works on all views
    • Show "mark all as read" and settings on all views
    • Use charset from feeds instead of using the HTTP charset
    • Some key-bindings change:
      • previous/next feed with p and n
      • toggle read/unread m

    If anything makes sense to you here, please let me know.

    If there's no interest in any of them, it's all good. :)

    Thanks for the great project.

  • Version v2.0 no longer works properly when setup behind reverse proxy

    Version v2.0 no longer works properly when setup behind reverse proxy

    I am trying to setup dockerized Yarr behind a Nginx reverse proxy. I have two Yarr docker images built right now: v1.4 and v2.0. Both versions work just fine when served directly, without reverse proxy.

    Docker image built from tag v1.4 works as expected. Nginx logs when accessing https://yarr.example.com:

    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET / HTTP/2.0" 200 39565 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/stylesheets/app.css HTTP/2.0" 200 10437 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/fetch.umd.js HTTP/2.0" 200 17934 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/vue.min.js HTTP/2.0" 200 93670 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/purify.min.js HTTP/2.0" 200 16941 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/url-polyfill.min.js HTTP/2.0" 200 6358 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/stylesheets/bootstrap.min.css HTTP/2.0" 200 160403 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/app.js HTTP/2.0" 200 18643 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/popper.min.js HTTP/2.0" 200 17883 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/api.js HTTP/2.0" 200 2967 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/vue-lazyload.js HTTP/2.0" 200 20764 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/Readability.min.js HTTP/2.0" 200 27755 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:27 +0000] "GET /static/javascripts/keybindings.js HTTP/2.0" 200 4904 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /static/javascripts/bootstrap-vue.min.js HTTP/2.0" 200 381485 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /api/feeds HTTP/2.0" 200 3 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /api/status HTTP/2.0" 200 25 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /api/folders HTTP/2.0" 200 3 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /api/settings HTTP/2.0" 200 162 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /api/items? HTTP/2.0" 200 37 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    192.168.1.5 - - [25/Apr/2021:14:22:28 +0000] "GET /static/graphicarts/anchor.png HTTP/2.0" 200 395 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    

    With v2.0, when I proceed to https://yarr.example.com, Firefox tries to download application/octet-stream file with a random name, without extension (for example dE9ike23). It seems to be a valid HTML file – see this gist. Nginx logs:

    192.168.1.5 - - [25/Apr/2021:14:23:59 +0000] "GET / HTTP/2.0" 200 5897 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
    

    Relevant part of the docker-compose file:

    [...]
      yarr:
        container_name: yarr
        image: yarr2     # or yarr1
        restart: always
        networks:
          - nginx
        expose:
          - 7070
        volumes:
          - yarr:/data
    [...]
    

    Relevant part of the Nginx config file:

    [...]
    server {
        listen 443 ssl http2;
        server_name yarr.example.com;
        location / {
            proxy_pass http://yarr:7070;
    
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    [...]
    

    Please let me know if above information is sufficient, or should I include anything else.

  • yarr as PWA?

    yarr as PWA?

    Hi, I was reading through your rationale and discovered your initial goal:

    a desktop application accessible via web browser
    

    That somehow sparked the question and idea to support yarr as a PWA, adding features like:

    • Installable via the webpage
    • Have a dedicated app icon
    • Proper app feeling, not just a webpage in a browser

    Checking pages like pwabuilder.com the minimum requirement would be:

    • [ ] A manifest file
    • [ ] Service Worker scripts

    Have you considered making yarr a PWA?

    I could help providing the necessary files, but have honestly no idea how to include them via GO. Anyway, wanted to check with you upfront.

    What do you think?

  • Issues on Windows

    Issues on Windows

    I've been using yarr on Windows and am facing few problems:

    1. There is no logging on stdout. I ran yarr.exe from command line and saw no logs. Running yarr.exe -h / --help prints nothing either.

    2. I'm unable to bind on any other host/port. When I run yarr.exe -addr 127.0.0.1:7080, the process starts and exits in a moment. Again, there are no logs so I can't see what happened.

    3. Once 2 works, I would like to bind to 0.0.0.0:7070 so I can access yarr from other devices on LAN. That will work, right?

  • feat: support config from json and env

    feat: support config from json and env

    • support env
    $env:YARR_DATABASE = "D:\software\yarr\storage.db"
    $env:YARR_OPENBROWSER = $True
    $env:YARR_LOGPATH = "D:\software\yarr\yarr.log"
    
    • save log to file

    • support opml file exported from newsflow

    <?xml version="1.0" encoding="utf-8"?>
    <opml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">
      <head>
        <title>Newsflow</title>
      </head>
      <body>
        <outline title="博客">
          <outline htmlUrl="https://m.thepaper.cn/list_26915" text="研习一个地方和一群人,记录城市的节奏与脉络。" title="澎湃新闻-城市漫步" xmlUrl="https://rsshub.app/thepaper/list/26915" />
        </outline>
      </body>
    </opml>
    
  • For high resolution screens, the sentences are too long

    For high resolution screens, the sentences are too long

    For high resolution screens (for example, iMac 4.5K display), the sentences are too long to read easily. I think it is good If there are some spaces beside the contents (like Feedbin or Feedly does).

    yarr (long sentences) Screenshot 2022-12-12 at 7 42 11 PM

    Feedbin for reference (centered) Screenshot 2022-12-12 at 7 51 19 PM

  • fever api support, #38

    fever api support, #38

    Fever API spec: https://github.com/DigitalDJ/tinytinyrss-fever-plugin/blob/master/fever-api.md

    base on fever branch, testing passed with Reeder app on MacOS. Welcome to use more Apps to test fever api.

  • The infinite scrolling doesn't load more posts with

    The infinite scrolling doesn't load more posts with "down arrow" key

    The infinite scroll doesn't work pressing "down key", it only works with "mouse wheel" or "trackpad" scrolling

    Just to explain better

    Screenshot from 2022-11-14 23-34-35

    Press down

    Screenshot from 2022-11-14 23-35-22

    the selection goes on the top of the list but..

    .. if you scroll with the trackpad it loads more posts

    Screenshot from 2022-11-14 23-36-00

  • Touch Gestures

    Touch Gestures

    I love the whole yarr experience even on mobile but I feel myself wanting to interact with it in a way it doesn't support yet.

    I want to implement 3 touch gestures I feel like it could use but I want to know if there is any interest in it.

    The three gestures are:

    • Swipe down on an open post to close it
    • Swipe left on an open post to go to the next post
    • Swipe right on an open post to go to the previous post

    In essence I just want to add the some of the same functionality granted by keyboard shortcuts on desktop.

A simple web-based time in/time out intended for home-based workers.

Web-based Time in/Time out About A simple web-based time in/time out intended for home-based workers. Pre-requisite To run the pre-built binary: An in

Dec 16, 2021
Goshort - Just another simple url shortener to use with curl

qnd.be Just another simple url shortener to use with curl. Kinda like 0x0.st. Ju

Jan 29, 2022
Another - REST API Written In Go

REST API Written In Go This simple REST API was built to better understand how t

Feb 10, 2022
Extract structured data from web sites. Web sites scraping.
Extract structured data from web sites. Web sites scraping.

Dataflow kit Dataflow kit ("DFK") is a Web Scraping framework for Gophers. It extracts data from web pages, following the specified CSS Selectors. You

Jan 7, 2023
記帳-PWA-web-app (Bookkeeping-PWA-web-app)
記帳-PWA-web-app (Bookkeeping-PWA-web-app)

GoKeep (bookkeeping web app) 記帳-PWA-web-app (Bookkeeping-PWA-web-app) demo link : https://bookkepping.herokuapp.com/ 測試用帳密 : tester002 , tester002 (亦可

Jan 31, 2022
log4jScanner: provides you with the ability to scan internal (only) subnets for vulnerable log4j web servicelog4jScanner: provides you with the ability to scan internal (only) subnets for vulnerable log4j web service
log4jScanner: provides you with the ability to scan internal (only) subnets for vulnerable log4j web servicelog4jScanner: provides you with the ability to scan internal (only) subnets for vulnerable log4j web service

log4jScanner Goals This tool provides you with the ability to scan internal (only) subnets for vulnerable log4j web services. It will attempt to send

Jan 5, 2023
Web terminal - A (unsafe) technical demo to export a shell to web browser
Web terminal - A (unsafe) technical demo to export a shell to web browser

Web Terminal A (unsafe) technical demo to export a shell to web browser. This pr

Dec 27, 2022
Go-web-scaffold - A simple scaffold for building web app quickly

Go-web-scaffold A simple scaffold for building web app quickly. features This sc

Jan 21, 2022
GoCondor is a golang web framework with an MVC like architecture, it's based on Gin framework
GoCondor is a golang web framework with an MVC like architecture, it's based on Gin framework

GoCondor is a golang web framework with an MVC like architecture, it's based on Gin framework, it features a simple organized directory structure for your next project with a pleasant development experience, made for developing modern APIs and microservices.

Dec 29, 2022
Retro-Floppy UI is a web based application for managing & using a GoTek floppy emulator running the Flash Floppy firmware.
Retro-Floppy UI is a web based application for managing & using a GoTek floppy emulator running the Flash Floppy firmware.

A web user interface for a GoTek running flashfloppy utilising a Raspberry PI 0W as the storage. This allows for remote uploading of files & selecting which disk image is loaded on a retro computer like the BBC Micro or Amiga A1200

Dec 10, 2022
A simple web library collection based fasthttp

A simple web library collection based fasthttp

Aug 17, 2022
No-frills, web-based remote controll for pianobar.
No-frills, web-based remote controll for pianobar.

pianobar-remote-control No-frills, web-based remote controll for pianobar. Motivation To be able to control (skip/volume/select-station) from web/phon

Aug 5, 2022
BotHub is a web-based robot editor built in go with support for go and python.

Robot Simulator This is an application to simulate toy robot moving on a square tabletop, The robot is free to roam around the surface of the table, b

May 16, 2022
IP geolocation web server

freegeoip NOTE: as of April 2018 this repository is no longer active. Please visit https://github.com/apilayer/freegeoip/ for the current version. Thi

Dec 26, 2022
Polite, slim and concurrent web crawler.

gocrawl gocrawl is a polite, slim and concurrent web crawler written in Go. For a simpler yet more flexible web crawler written in a more idiomatic Go

Dec 31, 2022
A quick and easy password protected web server for your files. httpfolder makes downloading/uploading files from your current working directory easy, even for fairly large files.

httpfolder A quick and easy password protected web server for your files. httpfolder makes downloading/uploading files from your current working direc

Sep 12, 2022
sigurlx a web application attack surface mapping tool.

sigurlx a web application attack surface mapping tool, it does ...:

Jul 24, 2021
Minimalist open-source web analytics

Zero-effort web analytics. This is a self-hosted open-source version of Nullitics.

Nov 10, 2022
Generate a modern Web project with Go and Angular, React or Vue in seconds 🚀
Generate a modern Web project with Go and Angular, React or Vue in seconds 🚀

Goxygen Generate a Web project with Go and Angular, React or Vue. Goxygen aims at saving your time while setting up a new project. It creates a skelet

Jan 5, 2023