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 {
|
|
||||||
log.Fatalf("Invalid auth: %v (expected `username:password`)", line)
|
|
||||||
}
|
}
|
||||||
username = parts[0]
|
} else if auth != "" {
|
||||||
password = parts[1]
|
username, password, err = parseAuthfile(strings.NewReader(auth))
|
||||||
break
|
if err != nil {
|
||||||
|
log.Fatal("Failed to parse auth literal: ", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
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,5 +1,32 @@
|
|||||||
# 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)
|
||||||
- (fix) old articles reappearing as unread (thanks to @adaszko for the report)
|
- (fix) old articles reappearing as unread (thanks to @adaszko 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 |