Compare commits
	
		
			80 Commits
		
	
	
		
			v2.3
			...
			841c342fcc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					841c342fcc | ||
| 
						 | 
					5aec3b4dab | ||
| 
						 | 
					d787060a24 | ||
| 
						 | 
					c1a29418eb | ||
| 
						 | 
					17847f999c | ||
| 
						 | 
					3adcddc70c | ||
| 
						 | 
					e9676491ee | ||
| 
						 | 
					1a545bb2a1 | ||
| 
						 | 
					1e128a7cd8 | ||
| 
						 | 
					5dbb6a710c | ||
| 
						 | 
					dadadeb066 | ||
| 
						 | 
					c76ff26bd6 | ||
| 
						 | 
					50f8648f64 | ||
| 
						 | 
					5f82a9e339 | ||
| 
						 | 
					3278ba4eac | ||
| 
						 | 
					9fc72f8b68 | ||
| 
						 | 
					b7b707bd43 | ||
| 
						 | 
					7cf27e0fde | ||
| 
						 | 
					66f2a973a3 | ||
| 
						 | 
					7ecbbff18a | ||
| 
						 | 
					850ce195a0 | ||
| 
						 | 
					479aebd023 | ||
| 
						 | 
					9b178d1fb3 | ||
| 
						 | 
					3ab098db5c | ||
| 
						 | 
					6d16e93008 | ||
| 
						 | 
					98934daee4 | ||
| 
						 | 
					259474cae9 | ||
| 
						 | 
					1e65a7951b | ||
| 
						 | 
					bed5640366 | ||
| 
						 | 
					57ea83cf4f | ||
| 
						 | 
					219842d723 | ||
| 
						 | 
					a96fc101f2 | ||
| 
						 | 
					81a77ce0a4 | ||
| 
						 | 
					9ed359f964 | ||
| 
						 | 
					bc18557820 | ||
| 
						 | 
					7d99edab8d | ||
| 
						 | 
					32ca121520 | ||
| 
						 | 
					9f1a0534a3 | ||
| 
						 | 
					d2678be96d | ||
| 
						 | 
					95ebbb9d13 | ||
| 
						 | 
					0f6d4d639d | ||
| 
						 | 
					795a5d2cb4 | ||
| 
						 | 
					dd5f760606 | ||
| 
						 | 
					58d6a46e36 | ||
| 
						 | 
					a8d7b86cdc | ||
| 
						 | 
					aac3de7ca2 | ||
| 
						 | 
					de24659bae | ||
| 
						 | 
					632412c10e | ||
| 
						 | 
					012b58bbe4 | ||
| 
						 | 
					c092842ee4 | ||
| 
						 | 
					e4c1d01915 | ||
| 
						 | 
					ce07ddea92 | ||
| 
						 | 
					bd6322e533 | ||
| 
						 | 
					91da774286 | ||
| 
						 | 
					e62906e63d | ||
| 
						 | 
					56e5625adc | ||
| 
						 | 
					1ecf4b0bb4 | ||
| 
						 | 
					57d9421c7f | ||
| 
						 | 
					a73188944d | ||
| 
						 | 
					97904cc0f3 | ||
| 
						 | 
					f28f354992 | ||
| 
						 | 
					698f5d6d06 | ||
| 
						 | 
					b935a1c511 | ||
| 
						 | 
					10e6bfa5a0 | ||
| 
						 | 
					f030a4075b | ||
| 
						 | 
					c9dd977600 | ||
| 
						 | 
					c1bcc0c517 | ||
| 
						 | 
					2a5692d9a7 | ||
| 
						 | 
					a8d160f9b1 | ||
| 
						 | 
					286cbff236 | ||
| 
						 | 
					fff0870d3b | ||
| 
						 | 
					fe22460c07 | ||
| 
						 | 
					18f2789a5d | ||
| 
						 | 
					7f161a5408 | ||
| 
						 | 
					cba3fbc48c | ||
| 
						 | 
					5e46f1480e | ||
| 
						 | 
					ead253c55f | ||
| 
						 | 
					6b8da92cb3 | ||
| 
						 | 
					a91f64ce9d | ||
| 
						 | 
					e1a6ccf133 | 
							
								
								
									
										12
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -7,7 +7,7 @@ on:
 | 
				
			|||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build_macos:
 | 
					  build_macos:
 | 
				
			||||||
    name: Build for MacOS
 | 
					    name: Build for MacOS
 | 
				
			||||||
    runs-on: macos-10.15
 | 
					    runs-on: macos-13
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: "Checkout"
 | 
					    - name: "Checkout"
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
@@ -16,7 +16,7 @@ jobs:
 | 
				
			|||||||
    - name: "Setup Go"
 | 
					    - name: "Setup Go"
 | 
				
			||||||
      uses: actions/setup-go@v2
 | 
					      uses: actions/setup-go@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: '^1.16'
 | 
					        go-version: '^1.17'
 | 
				
			||||||
    - name: Cache Go Modules
 | 
					    - name: Cache Go Modules
 | 
				
			||||||
      uses: actions/cache@v2
 | 
					      uses: actions/cache@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
@@ -34,7 +34,7 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  build_windows:
 | 
					  build_windows:
 | 
				
			||||||
    name: Build for Windows
 | 
					    name: Build for Windows
 | 
				
			||||||
    runs-on: windows-2019
 | 
					    runs-on: windows-2022
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: "Checkout"
 | 
					    - name: "Checkout"
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
@@ -43,7 +43,7 @@ jobs:
 | 
				
			|||||||
    - name: "Setup Go"
 | 
					    - name: "Setup Go"
 | 
				
			||||||
      uses: actions/setup-go@v2
 | 
					      uses: actions/setup-go@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: '^1.16'
 | 
					        go-version: '^1.17'
 | 
				
			||||||
    - name: Cache Go Modules
 | 
					    - name: Cache Go Modules
 | 
				
			||||||
      uses: actions/cache@v2
 | 
					      uses: actions/cache@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
@@ -61,7 +61,7 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  build_linux:
 | 
					  build_linux:
 | 
				
			||||||
    name: Build for Linux
 | 
					    name: Build for Linux
 | 
				
			||||||
    runs-on: ubuntu-18.04
 | 
					    runs-on: ubuntu-22.04
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: "Checkout"
 | 
					    - name: "Checkout"
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
@@ -70,7 +70,7 @@ jobs:
 | 
				
			|||||||
    - name: "Setup Go"
 | 
					    - name: "Setup Go"
 | 
				
			||||||
      uses: actions/setup-go@v2
 | 
					      uses: actions/setup-go@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: '^1.16'
 | 
					        go-version: '^1.17'
 | 
				
			||||||
    - name: Cache Go Modules
 | 
					    - name: Cache Go Modules
 | 
				
			||||||
      uses: actions/cache@v2
 | 
					      uses: actions/cache@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"flag"
 | 
						"flag"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
@@ -28,10 +29,25 @@ func opt(envVar, defaultValue string) string {
 | 
				
			|||||||
	return defaultValue
 | 
						return defaultValue
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func parseAuthfile(authfile io.Reader) (username, password string, err error) {
 | 
				
			||||||
 | 
						scanner := bufio.NewScanner(authfile)
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
 | 
							line := scanner.Text()
 | 
				
			||||||
 | 
							parts := strings.SplitN(line, ":", 2)
 | 
				
			||||||
 | 
							if len(parts) != 2 {
 | 
				
			||||||
 | 
								return "", "", fmt.Errorf("wrong syntax (expected `username:password`)")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							username = parts[0]
 | 
				
			||||||
 | 
							password = parts[1]
 | 
				
			||||||
 | 
							break
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return username, password, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	platform.FixConsoleIfNeeded()
 | 
						platform.FixConsoleIfNeeded()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var addr, db, authfile, certfile, keyfile, basepath, logfile string
 | 
						var addr, db, authfile, auth, certfile, keyfile, basepath, logfile string
 | 
				
			||||||
	var ver, open bool
 | 
						var ver, open bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	flag.CommandLine.SetOutput(os.Stdout)
 | 
						flag.CommandLine.SetOutput(os.Stdout)
 | 
				
			||||||
@@ -46,7 +62,8 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	flag.StringVar(&addr, "addr", opt("YARR_ADDR", "127.0.0.1:7070"), "address to run server on")
 | 
						flag.StringVar(&addr, "addr", opt("YARR_ADDR", "127.0.0.1:7070"), "address to run server on")
 | 
				
			||||||
	flag.StringVar(&basepath, "base", opt("YARR_BASE", ""), "base path of the service url")
 | 
						flag.StringVar(&basepath, "base", opt("YARR_BASE", ""), "base path of the service url")
 | 
				
			||||||
	flag.StringVar(&authfile, "auth-file", opt("YARR_AUTHFILE", ""), "`path` to a file containing username:password")
 | 
						flag.StringVar(&authfile, "auth-file", opt("YARR_AUTHFILE", ""), "`path` to a file containing username:password. Takes precedence over --auth (or YARR_AUTH)")
 | 
				
			||||||
 | 
						flag.StringVar(&auth, "auth", opt("YARR_AUTH", ""), "string with username and password in the format `username:password`")
 | 
				
			||||||
	flag.StringVar(&certfile, "cert-file", opt("YARR_CERTFILE", ""), "`path` to cert file for https")
 | 
						flag.StringVar(&certfile, "cert-file", opt("YARR_CERTFILE", ""), "`path` to cert file for https")
 | 
				
			||||||
	flag.StringVar(&keyfile, "key-file", opt("YARR_KEYFILE", ""), "`path` to key file for https")
 | 
						flag.StringVar(&keyfile, "key-file", opt("YARR_KEYFILE", ""), "`path` to key file for https")
 | 
				
			||||||
	flag.StringVar(&db, "db", opt("YARR_DB", ""), "storage file `path`")
 | 
						flag.StringVar(&db, "db", opt("YARR_DB", ""), "storage file `path`")
 | 
				
			||||||
@@ -94,16 +111,14 @@ func main() {
 | 
				
			|||||||
			log.Fatal("Failed to open auth file: ", err)
 | 
								log.Fatal("Failed to open auth file: ", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		defer f.Close()
 | 
							defer f.Close()
 | 
				
			||||||
		scanner := bufio.NewScanner(f)
 | 
							username, password, err = parseAuthfile(f)
 | 
				
			||||||
		for scanner.Scan() {
 | 
							if err != nil {
 | 
				
			||||||
			line := scanner.Text()
 | 
								log.Fatal("Failed to parse auth file: ", err)
 | 
				
			||||||
			parts := strings.Split(line, ":")
 | 
							}
 | 
				
			||||||
			if len(parts) != 2 {
 | 
						} else if auth != "" {
 | 
				
			||||||
				log.Fatalf("Invalid auth: %v (expected `username:password`)", line)
 | 
							username, password, err = parseAuthfile(strings.NewReader(auth))
 | 
				
			||||||
			}
 | 
							if err != nil {
 | 
				
			||||||
			username = parts[0]
 | 
								log.Fatal("Failed to parse auth literal: ", err)
 | 
				
			||||||
			password = parts[1]
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										47
									
								
								cmd/yarr/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPasswordFromAuthfile(t *testing.T) {
 | 
				
			||||||
 | 
						for _, tc := range [...]struct {
 | 
				
			||||||
 | 
							authfile         string
 | 
				
			||||||
 | 
							expectedUsername string
 | 
				
			||||||
 | 
							expectedPassword string
 | 
				
			||||||
 | 
							expectedError    bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								authfile:         "username:password",
 | 
				
			||||||
 | 
								expectedUsername: "username",
 | 
				
			||||||
 | 
								expectedPassword: "password",
 | 
				
			||||||
 | 
								expectedError:    false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								authfile:      "username-and-no-password",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								authfile:         "username:password:with:columns",
 | 
				
			||||||
 | 
								expectedUsername: "username",
 | 
				
			||||||
 | 
								expectedPassword: "password:with:columns",
 | 
				
			||||||
 | 
								expectedError:    false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						} {
 | 
				
			||||||
 | 
							t.Run(tc.authfile, func(t *testing.T) {
 | 
				
			||||||
 | 
								username, password, err := parseAuthfile(strings.NewReader(tc.authfile))
 | 
				
			||||||
 | 
								if tc.expectedUsername != username {
 | 
				
			||||||
 | 
									t.Errorf("expected username %q, got %q", tc.expectedUsername, username)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if tc.expectedPassword != password {
 | 
				
			||||||
 | 
									t.Errorf("expected password %q, got %q", tc.expectedPassword, password)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if tc.expectedError && err == nil {
 | 
				
			||||||
 | 
									t.Errorf("expected error, got nil")
 | 
				
			||||||
 | 
								} else if !tc.expectedError && err != nil {
 | 
				
			||||||
 | 
									t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								doc/build.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					## Compilation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Install `Go >= 1.17` 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # host-specific cli version (no gui)
 | 
				
			||||||
 | 
					    make build_default  # -> _output/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # ... or start a dev server locally
 | 
				
			||||||
 | 
					    make serve          # starts a server at http://localhost:7070
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # ... or build a docker image
 | 
				
			||||||
 | 
					    docker build -t yarr -f etc/dockerfile .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## ARM compilation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The instructions below are to cross-compile *yarr* to `Linux/ARM*`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Build:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    docker build -t yarr.arm -f etc/dockerfile.arm .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Test:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # inside host
 | 
				
			||||||
 | 
					    docker run -it --rm yarr.arm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # then, inside container
 | 
				
			||||||
 | 
					    cd /root/out
 | 
				
			||||||
 | 
					    qemu-aarch64 -L /usr/aarch64-linux-gnu/ yarr.arm64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Extract files from images:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CID=$(docker create yarr.arm)
 | 
				
			||||||
 | 
					    docker cp -a "$CID:/root/out" .
 | 
				
			||||||
 | 
					    docker rm "$CID"
 | 
				
			||||||
@@ -1,4 +1,31 @@
 | 
				
			|||||||
# upcoming
 | 
					# upcoming 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (new) Fever API support (thanks to @icefed)
 | 
				
			||||||
 | 
					- (fix) duplicate articles caused by the same feed addition (thanks to @adaszko)
 | 
				
			||||||
 | 
					- (fix) relative article links (thanks to @adazsko for the report)
 | 
				
			||||||
 | 
					- (fix) atom article links stored in id element (thanks to @adazsko for the report)
 | 
				
			||||||
 | 
					- (fix) parsing atom feed titles (thanks to @wnh)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# v2.4 (2023-08-15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (new) ARM build support (thanks to @tillcash & @fenuks)
 | 
				
			||||||
 | 
					- (new) auth configuration via param or env variable (thanks to @pierreprinetti)
 | 
				
			||||||
 | 
					- (new) web app manifest for an app-like experience on mobile (thanks to @qbit)
 | 
				
			||||||
 | 
					- (fix) concurrency issue crashing the app (thanks to @quoing)
 | 
				
			||||||
 | 
					- (fix) favicon visibility in dark mode (thanks to @caycaycarly for the report)
 | 
				
			||||||
 | 
					- (fix) autoloading more articles not working in certain edge cases (thanks to @fenuks for the report)
 | 
				
			||||||
 | 
					- (fix) handle Google URL redirects in "Read Here" (thanks to @cubbei for discovery)
 | 
				
			||||||
 | 
					- (fix) handle failures to extract content in "Read Here" (thanks to @grigio for the report)
 | 
				
			||||||
 | 
					- (fix) article view width for high resolution screens (thanks to @whaler-ragweed for the report)
 | 
				
			||||||
 | 
					- (fix) make newly added feed searchable (thanks to @BMorearty for the report)
 | 
				
			||||||
 | 
					- (fix) feed/article selection accessibility via arrow keys (thanks to @grigio and @tillcash)
 | 
				
			||||||
 | 
					- (fix) keyboard shortcuts in Firefox (thanks to @kaloyan13)
 | 
				
			||||||
 | 
					- (fix) keyboard shortcuts in non-English layouts (thanks to @kaloyan13)
 | 
				
			||||||
 | 
					- (fix) sorting articles with timezone information (thanks to @x2cf)
 | 
				
			||||||
 | 
					- (fix) handling links set in guid only for certain feeds (thanks to @adaszko for the report)
 | 
				
			||||||
 | 
					- (fix) crashes caused by feed icon endpoint (thanks to @adaszko)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# v2.3 (2022-05-03)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- (fix) handling encodings (thanks to @f100024 & @fserb)
 | 
					- (fix) handling encodings (thanks to @f100024 & @fserb)
 | 
				
			||||||
- (fix) parsing xml feeds with illegal characters (thanks to @stepelu for the report)
 | 
					- (fix) parsing xml feeds with illegal characters (thanks to @stepelu for the report)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								doc/fever.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					# Fever API support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Fever API is a kind of RSS HTTP API interface, because the Fever API definition is not very clear, so the implementation of Fever server and Client may have some compatibility problems.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Fever API implemented by Yarr is based on the Fever API spec: https://github.com/DigitalDJ/tinytinyrss-fever-plugin/blob/master/fever-api.md.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here are some Apps that have been tested to work with yarr.  Feel free to test other Clients/Apps and update the list here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>  Different apps support different URL/Address formats.  Please note whether the URL entered has `http://` scheme and `/` suffix.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| App                                                                       | Platforms        | Config Server URL                                   |
 | 
				
			||||||
 | 
					|:------------------------------------------------------------------------- | ---------------- |:--------------------------------------------------- |
 | 
				
			||||||
 | 
					| [Reeder](https://reederapp.com/)                                          | MacOS<br>iOS     | 127.0.0.1:7070/fever<br>http://127.0.0.1:7070/fever |
 | 
				
			||||||
 | 
					| [ReadKit](https://readkit.app/)                                           | MacOS<br>iOS     | http://127.0.0.1:7070/fever                         |
 | 
				
			||||||
 | 
					| [Fluent Reader](https://github.com/yang991178/fluent-reader)              | MacOS<br>Windows | http://127.0.0.1:7070/fever/                        |
 | 
				
			||||||
 | 
					| [Unread](https://apps.apple.com/us/app/unread-an-rss-reader/id1363637349) | iOS              | http://127.0.0.1:7070/fever                         |
 | 
				
			||||||
 | 
					| [Fiery Feeds](https://voidstern.net/fiery-feeds)                          | MacOS<br>iOS     | http://127.0.0.1:7070/fever                         |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you are having trouble using Fever, please open an issue and @icefed, thanks.
 | 
				
			||||||
							
								
								
									
										0
									
								
								doc/todo.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										44
									
								
								etc/dockerfile.arm
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					FROM ubuntu:20.04
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Install GCC
 | 
				
			||||||
 | 
					RUN apt update
 | 
				
			||||||
 | 
					RUN apt install -y \
 | 
				
			||||||
 | 
					        wget build-essential \
 | 
				
			||||||
 | 
					        gcc-aarch64-linux-gnu \
 | 
				
			||||||
 | 
					        binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg \
 | 
				
			||||||
 | 
					        gcc-arm-linux-gnueabihf \
 | 
				
			||||||
 | 
					        binutils-arm-linux-gnueabihf binutils-arm-linux-gnueabihf-dbg
 | 
				
			||||||
 | 
					RUN env DEBIAN_FRONTEND=noninteractive \
 | 
				
			||||||
 | 
					    apt install -y qemu-user qemu-user-static
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Install Golang
 | 
				
			||||||
 | 
					RUN wget --quiet https://go.dev/dl/go1.18.2.linux-amd64.tar.gz && \
 | 
				
			||||||
 | 
					    rm -rf /usr/local/go && \
 | 
				
			||||||
 | 
					    tar -C /usr/local -xzf go1.18.2.linux-amd64.tar.gz
 | 
				
			||||||
 | 
					ENV PATH=$PATH:/usr/local/go/bin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copy source code
 | 
				
			||||||
 | 
					WORKDIR /root/src
 | 
				
			||||||
 | 
					RUN mkdir /root/out
 | 
				
			||||||
 | 
					COPY . .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build ARM64
 | 
				
			||||||
 | 
					RUN env \
 | 
				
			||||||
 | 
					        CC=aarch64-linux-gnu-gcc \
 | 
				
			||||||
 | 
					        CGO_ENABLED=1 \
 | 
				
			||||||
 | 
					        GOOS=linux GOARCH=arm64 \
 | 
				
			||||||
 | 
					    go build \
 | 
				
			||||||
 | 
					        -tags "sqlite_foreign_keys linux" \
 | 
				
			||||||
 | 
					        -ldflags="-s -w" \
 | 
				
			||||||
 | 
					        -o /root/out/yarr.arm64 ./cmd/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN env \
 | 
				
			||||||
 | 
					        CC=arm-linux-gnueabihf-gcc \
 | 
				
			||||||
 | 
					        CGO_ENABLED=1 \
 | 
				
			||||||
 | 
					        GOOS=linux GOARCH=arm GOARM=7 \
 | 
				
			||||||
 | 
					    go build \
 | 
				
			||||||
 | 
					        -tags "sqlite_foreign_keys linux" \
 | 
				
			||||||
 | 
					        -ldflags="-s -w" \
 | 
				
			||||||
 | 
					        -o /root/out/yarr.arm7 ./cmd/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CMD ["/bin/bash"]
 | 
				
			||||||
							
								
								
									
										23
									
								
								etc/install-linux.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat >"$HOME/.local/share/applications/yarr.desktop" <<END
 | 
				
			||||||
 | 
					[Desktop Entry]
 | 
				
			||||||
 | 
					Name=yarr
 | 
				
			||||||
 | 
					Exec=$HOME/.local/bin/yarr -open
 | 
				
			||||||
 | 
					Icon=yarr
 | 
				
			||||||
 | 
					Type=Application
 | 
				
			||||||
 | 
					Categories=Internet;
 | 
				
			||||||
 | 
					END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat >"$HOME/.local/share/icons/yarr.svg" <<END
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-anchor-favicon">
 | 
				
			||||||
 | 
					  <circle cx="12" cy="5" r="3" stroke-width="4" stroke="#ffffff"></circle>
 | 
				
			||||||
 | 
					  <line x1="12" y1="22" x2="12" y2="8" stroke-width="4" stroke="#ffffff"></line>
 | 
				
			||||||
 | 
					  <path d="M5 12H2a10 10 0 0 0 20 0h-3" stroke-width="4" stroke="#ffffff"></path>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <circle cx="12" cy="5" r="3"></circle>
 | 
				
			||||||
 | 
					  <line x1="12" y1="22" x2="12" y2="8"></line>
 | 
				
			||||||
 | 
					  <path d="M5 12H2a10 10 0 0 0 20 0h-3"></path>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
 | 
					END
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								etc/promo.png
									
									
									
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 173 KiB  | 
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						@@ -1,9 +1,11 @@
 | 
				
			|||||||
module github.com/nkanaev/yarr
 | 
					module github.com/nkanaev/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.16
 | 
					go 1.17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.7
 | 
						github.com/mattn/go-sqlite3 v1.14.7
 | 
				
			||||||
	golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420
 | 
						golang.org/x/net v0.8.0
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6
 | 
						golang.org/x/sys v0.6.0
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require golang.org/x/text v0.8.0 // indirect
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						@@ -1,12 +1,39 @@
 | 
				
			|||||||
github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
 | 
					github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 | 
					github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 | 
				
			||||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk=
 | 
					github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
				
			||||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
				
			||||||
 | 
					golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 | 
				
			||||||
 | 
					golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
 | 
				
			||||||
 | 
					golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c=
 | 
					golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
					golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
					golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
				
			||||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 | 
					golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
				
			||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
					golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 | 
				
			||||||
 | 
					golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
				
			||||||
 | 
					golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 | 
				
			||||||
 | 
					golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
 | 
				
			||||||
 | 
					golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								makefile
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,4 @@
 | 
				
			|||||||
VERSION=2.3
 | 
					VERSION=2.4
 | 
				
			||||||
GITHASH=$(shell git rev-parse --short=8 HEAD)
 | 
					GITHASH=$(shell git rev-parse --short=8 HEAD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CGO_ENABLED=1
 | 
					CGO_ENABLED=1
 | 
				
			||||||
@@ -8,26 +8,26 @@ GO_LDFLAGS := $(GO_LDFLAGS) -X 'main.Version=$(VERSION)' -X 'main.GitHash=$(GITH
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
build_default:
 | 
					build_default:
 | 
				
			||||||
	mkdir -p _output
 | 
						mkdir -p _output
 | 
				
			||||||
	go build -tags "sqlite_foreign_keys release" -ldflags="$(GO_LDFLAGS)" -o _output/yarr src/main.go
 | 
						go build -tags "sqlite_foreign_keys" -ldflags="$(GO_LDFLAGS)" -o _output/yarr ./cmd/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_macos:
 | 
					build_macos:
 | 
				
			||||||
	mkdir -p _output/macos
 | 
						mkdir -p _output/macos
 | 
				
			||||||
	GOOS=darwin GOARCH=amd64 go build -tags "sqlite_foreign_keys release macos" -ldflags="$(GO_LDFLAGS)" -o _output/macos/yarr src/main.go
 | 
						GOOS=darwin GOARCH=amd64 go build -tags "sqlite_foreign_keys macos" -ldflags="$(GO_LDFLAGS)" -o _output/macos/yarr ./cmd/yarr
 | 
				
			||||||
	cp src/platform/icon.png _output/macos/icon.png
 | 
						cp src/platform/icon.png _output/macos/icon.png
 | 
				
			||||||
	go run bin/package_macos.go -outdir _output/macos -version "$(VERSION)"
 | 
						go run ./cmd/package_macos -outdir _output/macos -version "$(VERSION)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_linux:
 | 
					build_linux:
 | 
				
			||||||
	mkdir -p _output/linux
 | 
						mkdir -p _output/linux
 | 
				
			||||||
	GOOS=linux GOARCH=amd64 go build -tags "sqlite_foreign_keys release linux" -ldflags="$(GO_LDFLAGS)" -o _output/linux/yarr src/main.go
 | 
						GOOS=linux GOARCH=amd64 go build -tags "sqlite_foreign_keys linux" -ldflags="$(GO_LDFLAGS)" -o _output/linux/yarr ./cmd/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_windows:
 | 
					build_windows:
 | 
				
			||||||
	mkdir -p _output/windows
 | 
						mkdir -p _output/windows
 | 
				
			||||||
	go run bin/generate_versioninfo.go -version "$(VERSION)" -outfile src/platform/versioninfo.rc
 | 
						go run ./cmd/generate_versioninfo -version "$(VERSION)" -outfile src/platform/versioninfo.rc
 | 
				
			||||||
	windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
 | 
						windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
 | 
				
			||||||
	GOOS=windows GOARCH=amd64 go build -tags "sqlite_foreign_keys release windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe src/main.go
 | 
						GOOS=windows GOARCH=amd64 go build -tags "sqlite_foreign_keys windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe ./cmd/yarr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
serve:
 | 
					serve:
 | 
				
			||||||
	go run -tags "sqlite_foreign_keys" src/main.go -db local.db
 | 
						go run -tags "sqlite_foreign_keys" ./cmd/yarr -db local.db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test:
 | 
					test:
 | 
				
			||||||
	cd src && go test -tags "sqlite_foreign_keys release" ./...
 | 
						cd src && go test -tags "sqlite_foreign_keys" ./...
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										63
									
								
								readme.md
									
									
									
									
									
								
							
							
						
						@@ -3,67 +3,36 @@
 | 
				
			|||||||
**yarr** (yet another rss reader) is a web-based feed aggregator which can be used both
 | 
					**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.
 | 
					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.
 | 
					The app is a single binary with an embedded database (SQLite).
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## usage
 | 
					## usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The latest prebuilt binaries for Linux/MacOS/Windows are available
 | 
					The latest prebuilt binaries for Linux/MacOS/Windows AMD64 are available
 | 
				
			||||||
[here](https://github.com/nkanaev/yarr/releases/latest).
 | 
					[here](https://github.com/nkanaev/yarr/releases/latest). Installation instructions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### macos
 | 
					* MacOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Download `yarr-*-macos64.zip`, unzip it, place `yarr.app` in `/Applications` folder.
 | 
					  Download `yarr-*-macos64.zip`, unzip it, place `yarr.app` in `/Applications` folder, [open the app][macos-open], click the anchor menu bar icon, select "Open".
 | 
				
			||||||
To open the app follow the instructions provided [here][macos-open] or run the command below:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xattr -d com.apple.quarantine /Applications/yarr.app
 | 
					* Windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Download `yarr-*-windows64.zip`, unzip it, open `yarr.exe`, click the anchor system tray icon, select "Open".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Download `yarr-*-linux64.zip`, unzip it, place `yarr` in `$HOME/.local/bin`
 | 
				
			||||||
 | 
					and run [the script](etc/install-linux.sh).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[macos-open]: https://support.apple.com/en-gb/guide/mac-help/mh40616/mac
 | 
					[macos-open]: https://support.apple.com/en-gb/guide/mac-help/mh40616/mac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 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.
 | 
					For self-hosting, see `yarr -h` for auth, tls & server configuration flags.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## build
 | 
					See more:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Install `Go >= 1.16` and `gcc`. Get the source code:
 | 
					* [Building from source code](doc/build.md)
 | 
				
			||||||
 | 
					* [Fever API support](doc/fever.md)
 | 
				
			||||||
    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
 | 
					## credits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,3 @@
 | 
				
			|||||||
// +build release
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package assets
 | 
					package assets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "embed"
 | 
					import "embed"
 | 
				
			||||||
@@ -8,6 +6,7 @@ import "embed"
 | 
				
			|||||||
//go:embed graphicarts
 | 
					//go:embed graphicarts
 | 
				
			||||||
//go:embed javascripts
 | 
					//go:embed javascripts
 | 
				
			||||||
//go:embed stylesheets
 | 
					//go:embed stylesheets
 | 
				
			||||||
 | 
					//go:embed manifest.json
 | 
				
			||||||
var embedded embed.FS
 | 
					var embedded embed.FS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-144-144.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-192-192.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-48-48.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-512-512.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 26 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-72-72.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/android/android-launchericon-96-96.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/favicon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										9
									
								
								src/assets/graphicarts/favicon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-anchor-favicon">
 | 
				
			||||||
 | 
					  <circle cx="12" cy="5" r="3" stroke-width="4" stroke="#ffffff"></circle>
 | 
				
			||||||
 | 
					  <line x1="12" y1="22" x2="12" y2="8" stroke-width="4" stroke="#ffffff"></line>
 | 
				
			||||||
 | 
					  <path d="M5 12H2a10 10 0 0 0 20 0h-3" stroke-width="4" stroke="#ffffff"></path>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <circle cx="12" cy="5" r="3"></circle>
 | 
				
			||||||
 | 
					  <line x1="12" y1="22" x2="12" y2="8"></line>
 | 
				
			||||||
 | 
					  <path d="M5 12H2a10 10 0 0 0 20 0h-3"></path>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 603 B  | 
| 
		 Before Width: | Height: | Size: 103 KiB  | 
| 
		 Before Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/1024.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 56 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/114.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/120.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/144.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/152.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 515 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/167.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/180.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/192.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/20.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 699 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/256.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/29.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 939 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1010 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/40.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/50.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/512.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 26 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/57.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/58.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/60.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/64.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/72.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/76.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/80.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/ios/87.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/LargeTile.scale-100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/LargeTile.scale-125.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 19 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/LargeTile.scale-150.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 24 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/LargeTile.scale-200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/LargeTile.scale-400.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 69 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SmallTile.scale-100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SmallTile.scale-125.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SmallTile.scale-150.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SmallTile.scale-200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SmallTile.scale-400.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SplashScreen.scale-100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SplashScreen.scale-125.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 20 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SplashScreen.scale-150.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 25 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SplashScreen.scale-200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 34 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/SplashScreen.scale-400.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 75 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/Square150x150Logo.scale-100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/Square150x150Logo.scale-125.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/Square150x150Logo.scale-150.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/Square150x150Logo.scale-200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/graphicarts/windows11/Square150x150Logo.scale-400.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 31 KiB  | 
| 
		 After Width: | Height: | Size: 602 B  | 
| 
		 After Width: | Height: | Size: 715 B  | 
| 
		 After Width: | Height: | Size: 722 B  | 
| 
		 After Width: | Height: | Size: 13 KiB  | 
| 
		 After Width: | Height: | Size: 1.0 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
| 
		 After Width: | Height: | Size: 2.1 KiB  | 
| 
		 After Width: | Height: | Size: 2.3 KiB  | 
| 
		 After Width: | Height: | Size: 2.4 KiB  | 
| 
		 After Width: | Height: | Size: 2.8 KiB  | 
| 
		 After Width: | Height: | Size: 3.3 KiB  | 
| 
		 After Width: | Height: | Size: 602 B  | 
| 
		 After Width: | Height: | Size: 715 B  | 
| 
		 After Width: | Height: | Size: 722 B  | 
| 
		 After Width: | Height: | Size: 13 KiB  | 
| 
		 After Width: | Height: | Size: 1.0 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 KiB  |