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

Overview

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.

Issues
  • 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.

    help wanted 
    opened by tillcash 15
  • 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!

    opened by adaszko 10
  • 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
    
    bug 
    opened by minioin 7
  • 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?

    opened by Farow 6
  • 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.

    help wanted 
    opened by epmills 6
  • 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.

    opened by fserb 5
  • 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.

    opened by verahawk 5
  • 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?

    help wanted 
    opened by einschmidt 5
  • 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?

    opened by dufferzafar 4
  • 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>
    
    opened by huangnauh 4
  • crash immediately after starting

    crash immediately after starting

    Crash happens only when I load the web interface.

    2022/06/11 18:47:08 worker.go:105: Refreshing feeds
    fatal error: concurrent map read and map write
    
    goroutine 195 [running]:
    runtime.throw({0x964509?, 0xc0007277c8?})
    	/opt/hostedtoolcache/go/1.18.1/x64/src/runtime/panic.go:992 +0x71 fp=0xc000727770 sp=0xc000727740 pc=0x442bb1
    runtime.mapaccess1_faststr(0x6f0000006e?, 0x94fecf?, {0xc0001188d0, 0x8})
    	/opt/hostedtoolcache/go/1.18.1/x64/src/runtime/map_faststr.go:22 +0x3a5 fp=0xc0007277d8 sp=0xc000727770 pc=0x421585
    github.com/nkanaev/yarr/src/server.(*Server).handleFeedIcon(0xc000198600, 0xc000489100)
    	/home/runner/work/yarr/yarr/src/server/routes.go:162 +0xaf fp=0xc000727970 sp=0xc0007277d8 pc=0x7e278f
    github.com/nkanaev/yarr/src/server.(*Server).handleFeedIcon-fm(0x91ea20?)
    	<autogenerated>:1 +0x2c fp=0xc000727990 sp=0xc000727970 pc=0x7e59ec
    github.com/nkanaev/yarr/src/server/router.(*Context).Next(...)
    	/home/runner/work/yarr/yarr/src/server/router/context.go:24
    
    opened by minioin 3
  • yarr is feature complete

    yarr is feature complete

    thank you for your interest in the project. unfortunately, i cannot accept any more new features. the project was created due to lack of the application that i wanted, and it's already serving my own needs. i'd like to keep it simple.

    yarr is not being deprecated. it's my go-to feed reader, and i'll gladly fix bugs & accept patches to improve the existing functionality.

    my only requests for contributors would be:

    • to not introduce any 3rd party dependencies
    • to cover new code with unit tests whenever possible

    if you'd like to introduce new features, please do so by forking it. i won't guarantee that it'd be merged to the upstream though.

    opened by nkanaev 2
Releases(v2.3)
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

Raffy Doquenia 0 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

rune 0 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

null 0 Feb 10, 2022
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

Dmitry Narizhnykh 532 Jun 27, 2022
記帳-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 (亦可

Yu-Zhuang Lin 5 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 Goals This tool provides you with the ability to scan internal (only) subnets for vulnerable log4j web services. It will attempt to send

Profero 477 Jun 27, 2022
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

null 50 Jun 7, 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

Statrue 3 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, it features a simple organized directory structure for your next project with a pleasant development experience, made for developing modern APIs and microservices.

Go Condor 35 May 15, 2022
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

Peter Mount 5 Aug 26, 2021
A simple web library collection based fasthttp

A simple web library collection based fasthttp

snowmerak 11 Feb 25, 2022
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

J Cuga 3 Mar 15, 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

null 1 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

Alexandre Fiori 4.8k Jun 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

null 2k Jun 26, 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

null 14 Dec 13, 2021
sigurlx a web application attack surface mapping tool.

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

Alex Munene 31 Jul 24, 2021
Minimalist open-source web analytics

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

null 77 Jun 9, 2022
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

Sasha Shpota 2.4k Jun 22, 2022