yarr
Overview
yarr (yet another rss reader) is a fast, lightweight, self-hosted RSS and Atom feed reader and aggregator. It is a single Go binary with an embedded web interface and an embedded SQLite database, so it stays small, starts instantly and keeps your reading history entirely on infrastructure you control. Subscribe to any website's feed, organise subscriptions into folders, and read articles in a clean three-pane reading view with unread tracking, full-text search, a built-in readability mode and OPML import and export.
The SecureAnyCloud image installs yarr 2.8 and puts it behind an nginx reverse proxy that binds the server to loopback. The appliance is secure by default: an nginx login prompt protects the reader, and there is no default password. On first boot, yarr-firstboot.service generates a unique administrator password and writes it to a root-only note at /root/yarr-info.txt. Nothing is baked into the image.
The reader also ships with a small set of self-contained demo feeds, served from the image itself, so the interface is populated the moment you sign in.
What you get:
- yarr 2.8 single Go binary (
/usr/local/bin/yarr) - SQLite feed and article database at
/var/lib/yarr/storage.db(no separate database to maintain) yarr.servicerunning asyarr, bound to loopback127.0.0.1:7070nginx.servicereverse proxy on TCP 80 with an HTTP Basic Auth login gate, TLS-readyyarr-firstboot.servicegenerating a per-VM administrator password on first boot- Self-contained demo feeds, so the reader is populated at first sign-in
- A built-in readability view, full-text search, folders, OPML import and export, and a Fever-compatible API for mobile apps
- Ubuntu 24.04 LTS base, latest patches, unattended security upgrades enabled
- 24/7 SecureAnyCloud support, 24-hour response SLA
Prerequisites
Before you deploy, make sure you have:
- An active Azure subscription
- An SSH key
- A VNet with a subnet
Recommended VM size: Standard_B2s. yarr is very light, and 4 GB of RAM is plenty.
Deploy from the Azure Portal
Search the Azure Marketplace for yarr, choose the plan, and create the VM. In the networking step, attach an NSG that allows inbound TCP 22 (SSH) and TCP 80 (the web UI) from your client networks only.
For production, put a TLS reverse proxy in front of port 80.
Deploy from the Azure CLI
RG="yarr-prod"; LOCATION="eastus"; VM_NAME="yarr-01" IMAGE_URN="sac1647283583153:yarr-ubuntu-24-04:default:latest"
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:yarr-ubuntu-24-04:default:latest
az vm create \
--resource-group "$RG" --name "$VM_NAME" --location "$LOCATION" \
--image "$IMAGE_URN" --size Standard_B2s \
--admin-username azureuser --generate-ssh-keys \
--public-ip-sku Standard
# then open TCP 80 to your own client network only:
az vm open-port --resource-group "$RG" --name "$VM_NAME" --port 80 --priority 900Connect over SSH
Connect to the VM with SSH:
ssh azureuser@<vm-ip>yarr.service, nginx.service and yarr-firstboot.service all start automatically on first boot.
Verify the service
Check that the services are running and listening:
sudo systemctl is-active yarr nginx yarr-firstboot
sudo test -f /var/lib/sac/data/yarr-firstboot.done && echo FIRSTBOOT_DONE
sudo ss -tlnp | grep -E ':80 |:7070 'Expected output: all three services are active, nginx is bound to the public port 80, and yarr is bound to loopback 127.0.0.1:7070 only:
active active active FIRSTBOOT_DONE LISTEN 0 4096 127.0.0.1:7070 0.0.0.0:* users:(("yarr",...)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",...))Get your login credentials
The reader has no default password. On first boot, the image generates a unique administrator password and writes it to a root-only note. The nginx login gate requires that password:
sudo cat /root/yarr-info.txt curl -s -o /dev/null -w 'no credentials -> HTTP %{http_code}\n' http://127.0.0.1/api/status
P=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'with the per-VM login -> HTTP %{http_code}\n' -u "admin:$P" http://127.0.0.1/api/statusThe note contains the administrator username, password and URL, all unique to this machine and never baked into the image. An unauthenticated request is rejected with 401, and the per-VM login returns 200:
YARR_ADMIN_USERNAME=admin YARR_ADMIN_PASSWORD=<YARR_ADMIN_PASSWORD> YARR_URL=http://<vm-ip>/ no credentials -> HTTP 401 with the per-VM login -> HTTP 200The YARR_URL line uses the address that the VM sees for itself. Browse to the reader using your VM's own public IP address.
Read feeds through the API
yarr exposes a small JSON API behind the same login. List the subscribed feeds and count the stored articles. The image ships with the demo feeds already fetched:
P=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
curl -s -u "admin:$P" http://127.0.0.1/api/feeds | jq '[.[]|{title, feed_link}]'
curl -s -u "admin:$P" http://127.0.0.1/api/items | jq '{articles: (.list|length)}'The two demo feeds are listed and their articles are already stored:
[ { "title": "sac on Azure", "feed_link": "http://127.0.0.1/demo/sac.xml" }, { "title": "Welcome to yarr", "feed_link": "http://127.0.0.1/demo/welcome.xml" } ] { "articles": 6 }Sign in to the web UI
Open the web UI in a browser at your VM's public IP address. When the nginx login prompt appears, enter the username admin and the password from Step 5.
After you sign in, you see the three-pane reader: your folders and feeds on the left, the article list in the middle, and the reading pane on the right. The demo feeds and their articles are already loaded.
Read an article
Click any article in the middle column to open it in the reading pane on the right. Use the toolbar to mark it read or starred, open the original link, or step to the next and previous articles.
For sites that publish only a summary in their feed, the readability button fetches and cleans the full article content.
Add your own feeds
Open the menu in the sidebar and choose New Feed, then paste any website or feed URL. yarr discovers the feed automatically, fetches the latest articles and files them under a folder of your choosing.
To bring in an existing subscription list, choose Import (OPML).
Keyboard shortcuts
yarr is built for fast, keyboard-driven reading. Open Shortcuts from the sidebar menu to see the full list. For example, j/k move between articles, 1/2/3 switch between unread, starred and all, / focuses the search box, and r marks an article read.
Server components
Everything the image installs lives in a handful of predictable paths:
/usr/local/bin/yarr -version ls -1 /usr/local/bin/yarr /var/lib/yarr/storage.db /etc/yarr/yarr.env \
/etc/systemd/system/yarr.service /usr/local/sbin/yarr-firstboot.sh \
/etc/nginx/sites-available/sac-yarrExpected output: the pinned version and the installed components:
v2.8 (...) /usr/local/bin/yarr /var/lib/yarr/storage.db /etc/yarr/yarr.env /etc/systemd/system/yarr.service /usr/local/sbin/yarr-firstboot.sh /etc/nginx/sites-available/sac-yarrManage the service
Check and control the service with systemd:
sudo systemctl status yarr --no-pager sudo systemctl restart yarr
sudo journalctl -u yarr -n 50 --no-pageryarr is a simple systemd service with Restart=always, so it comes back automatically after a crash or a reboot. Its data lives in /var/lib/yarr/storage.db. Back up that single file to preserve your subscriptions and read state.
Change the login password
nginx HTTP Basic Auth enforces the login, using the file /etc/nginx/yarr.htpasswd. To set a new password, overwrite that file. The apache2-utils package provides htpasswd, or you can use openssl:
NEWPASS='<new-password>' echo "admin:$(openssl passwd -apr1 "$NEWPASS")" | sudo tee /etc/nginx/yarr.htpasswd >/dev/null
sudo systemctl reload nginxUpdate /root/yarr-info.txt to match if you rely on it, and store the new password in your own secrets manager.
Add TLS (optional)
For production, terminate TLS in front of port 80. The reverse proxy is already in place. Add a certificate with certbot against your own domain name:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.comcertbot edits the nginx server block to listen on 443 with your certificate, and it can redirect HTTP to HTTPS. When TLS is in place, the browser login is protected in transit.
Import an OPML subscription list
If you are migrating from another reader, export your subscriptions as OPML and import them from the sidebar menu with Import, or import them through the API:
P=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
curl -s -u "admin:$P" -F "opml=@<backup-dir>/subscriptions.opml" http://127.0.0.1/opml/import -o /dev/null -w '%{http_code}\n'yarr creates the folders and feeds from the OPML file and refreshes them.
Security recommendations
- Restrict inbound TCP 80 (and 443) to your own client networks with an NSG.
- Add TLS (Step 14) so the login and your reading are encrypted in transit.
- Change the login password (Step 13) and keep
/root/yarr-info.txtreadable only by root. - Keep yarr bound to loopback only, and never expose port 7070 directly.
- Keep the OS patched. Unattended security upgrades are enabled by default.
Support and licensing
yarr is distributed under the MIT license. This is a repackaged open-source software product with additional charges for SecureAnyCloud support services. All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on Azure
Find yarr on Ubuntu 24.04 LTS on the Azure Marketplace and launch it in minutes.
Need Help?
SecureAnyCloud provides 24/7 support with a 24-hour response SLA. Visit secureanycloud.com or contact support through the Azure Marketplace listing.
Deploy on Azure
Launch yarr on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
This image runs yarr (yet another rss reader), a fast, lightweight open source self-hosted RSS and Atom feed reader and aggregator. yarr is a single Go binary with an embedded web interface and an embedded SQLite database, so it starts instantly and keeps your reading history entirely on infrastructure you control. Subscribe to any website's feed, organise subscriptions into folders, and read articles in a clean three-pane view with unread tracking, full-text search, a built-in readability mode, and OPML import and export.
The SecureAnyCloud image is secure by default. yarr's web interface has no server-side authentication of its own, so this image binds yarr only to the loopback interface and fronts it with nginx on port 80 enforcing an HTTP login. The password is a unique value generated on first boot for each instance and written to a root-only file. No credential is baked into the image, and no two deployments share one.
What you get:
- yarr installed as the official prebuilt Linux server binary at
/usr/local/bin/yarr - A dedicated non-root
yarrservice (yarr.service) bound to127.0.0.1:7070 - The SQLite feed database on its own dedicated, independently resizable data volume at
/var/lib/yarr - nginx on port
80reverse proxying the reader with an HTTP login, plus a loopback-only/healthzendpoint for health probes - A one-shot
yarr-firstboot.servicethat generates a per-instance password on first boot and writes it to/root/yarr-info.txt(mode0600) - Self-contained demo feeds, so the reader is populated the moment you sign in
- A fully patched Ubuntu 24.04 LTS base
- 24/7 SecureAnyCloud support
yarr is published by its author under the MIT licence. This image is packaged by SecureAnyCloud and is not affiliated with or endorsed by the yarr project.
Prerequisites
Before you launch, make sure you have:
- An AWS account
- An EC2 key pair in the target region
- A VPC with a public subnet
Recommended instance type: m5.large (2 vCPU / 8 GiB RAM). yarr is lightweight and runs comfortably on smaller types too.
Security group inbound: allow 22/tcp from your management network for SSH and 80/tcp for the reader.
yarr serves plain HTTP on port 80. For production or shared access, terminate TLS in front of it with your own domain using nginx or an Application Load Balancer (see Step 10).
Step 1 - Launch the AMI
Subscribe to the listing in AWS Marketplace, choose Continue to Launch, and launch through the EC2 console or the AWS CLI. Select the m5.large instance type, your key pair and a security group that opens ports 22 and 80.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <your-key-pair> \
--security-group-ids <security-group-id> \
--subnet-id <subnet-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=yarr}]'Step 2 - Connect to your instance
Connect over SSH as the default login user for the OS variant you launched. This listing may ship more than one OS variant, so use the matching login user.
- Ubuntu 24.04 LTS: the SSH login user is ubuntu. Connect with ssh ubuntu@<instance-public-ip>
Step 3 - Confirm the services are running
yarr runs as yarr.service on the loopback interface, fronted by nginx on port 80. A one-shot yarr-firstboot.service runs once on first boot to generate the per-instance password. Confirm all three units are active, and that nginx is listening on port 80 while yarr stays private on 127.0.0.1:7070:
systemctl is-active yarr nginx yarr-firstboot
sudo ss -tlnp | grep -E ":80 |:7070 "Expected output:
active active active LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",...)) LISTEN 0 4096 127.0.0.1:7070 0.0.0.0:* users:(("yarr",...)) LISTEN 0 511 [::]:80 [::]:* users:(("nginx",...))nginx is reachable on port 80, and yarr is bound to 127.0.0.1 only, so it can never be reached directly. The login that nginx enforces cannot be bypassed.
Step 4 - Confirm the feed database is on its own data volume
The SQLite feed database lives on a dedicated EBS data volume mounted at /var/lib/yarr, separate from the operating system disk, so you can resize or snapshot it independently. Confirm it is a mount point of its own:
findmnt /var/lib/yarr
sudo ls -l /var/lib/yarr/storage.dbStep 5 - Read your unique credential
Each instance generates its own random administrator password on first boot and writes it to a root-only file. Read your username, URL and password:
sudo cat /root/yarr-info.txtThe username is admin. Keep this file secret. It is the only place where the generated password is stored.
Step 6 - Confirm the secure-by-default posture from the command line
Before you sign in, prove that the reader is protected. The following commands read your per-instance password from the root-only file, then show that an unauthenticated request and a wrong password are both rejected with 401, while the correct credential returns 200:
PW=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
echo "unauth : $(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/api/status)"
echo "wrongpw: $(curl -s -o /dev/null -w '%{http_code}' -u admin:wrong-password http://127.0.0.1/api/status)"
echo "authed : $(curl -s -o /dev/null -w '%{http_code}' -u "admin:$PW" http://127.0.0.1/api/status)"Expected output:
unauth : 401 wrongpw: 401 authed : 200The reader arrives pre-populated with self-contained demo feeds so the interface is not empty on first sign-in. Confirm the demo articles are present:
PW=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
curl -s -u "admin:$PW" http://127.0.0.1/api/items | \
python3 -c 'import json,sys; print("articles in reader:", len(json.load(sys.stdin)["list"]))'Step 7 - Sign in and read
Open http://<instance-public-ip>/ in a browser. When prompted, sign in with the username admin and the password from /root/yarr-info.txt. The three-pane reader loads with the demo feeds already populated: folders and feeds on the left, the article list in the middle, and the reading pane on the right.
Click any article to open it in the reading pane. Use the readability view to strip clutter, mark items read or starred, and switch between light, sepia and dark themes.
Step 8 - Add and organise your own feeds
Open the settings menu (the ... button, top-left) and choose New Feed, then paste any website or feed URL. yarr discovers the feed automatically. Drag feeds into folders to organise them. The same menu offers Import and Export for moving your subscriptions in and out as OPML, a light/sepia/dark Theme switch, and an Auto Refresh interval.
You can also add a feed from the command line through the API. The image ships a small self-contained self-test feed served locally, so this works offline and proves live feed fetching on your instance:
PW=$(sudo grep '^YARR_ADMIN_PASSWORD=' /root/yarr-info.txt | cut -d= -f2-)
ADD=$(curl -s -u "admin:$PW" -H 'Content-Type: application/json' \
--data '{"url":"http://127.0.0.1/demo/selftest.xml"}' http://127.0.0.1/api/feeds)
FID=$(echo "$ADD" | python3 -c 'import json,sys; print(json.load(sys.stdin)["feed"]["id"])')
echo "add status: $(echo "$ADD" | python3 -c 'import json,sys; print(json.load(sys.stdin)["status"])')" sleep 2 curl -s -u "admin:$PW" "http://127.0.0.1/api/items?feed_id=$FID" | \
python3 -c 'import json,sys; print("fetched items:", len(json.load(sys.stdin)["list"]))' curl -s -o /dev/null -u "admin:$PW" -X DELETE "http://127.0.0.1/api/feeds/$FID"
echo "self-test feed removed"Expected output:
add status: success fetched items: 1 self-test feed removedStep 9 - Change the login password
nginx enforces the login using a per-instance htpasswd file. To set your own password, overwrite the htpasswd entry for admin and reload nginx. The command prompts you for the new password twice:
sudo sh -c 'printf "admin:%s\n" "$(openssl passwd -apr1)" > /etc/nginx/yarr.htpasswd'
sudo chown root:www-data /etc/nginx/yarr.htpasswd
sudo chmod 640 /etc/nginx/yarr.htpasswd
sudo systemctl reload nginxUpdate /root/yarr-info.txt if you want to keep a record.
Step 10 - Terminate TLS with your own domain (recommended)
yarr serves plain HTTP on port 80. For production, put your own domain and certificate in front of nginx. Point a DNS record at the instance, then do one of the following:
- Add a TLS server block to nginx with a certificate from your CA (for example Let's Encrypt via certbot).
- Place the instance behind an Application Load Balancer with an ACM certificate, and forward to port 80.
Keep the loopback bind and the HTTP login in place behind your TLS terminator.
Troubleshooting
- Browser keeps asking for the password: confirm that you are using the value from
/root/yarr-info.txt(usernameadmin). Re-read it withsudo cat /root/yarr-info.txt. - 502/500 from nginx: check that yarr is up with
systemctl status yarrandcurl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/healthz(expect200). If the htpasswd file is missing, nginx returns an error on the login-protected path by design. Re-run Step 9 to recreate the file. - Feeds not updating: yarr fetches on a schedule. Set an interval under settings Auto Refresh, or use Refresh Feeds to fetch immediately. The instance needs outbound HTTPS to reach external feeds.
- Resizing storage: grow the
/var/lib/yarrEBS volume in the console, then runsudo growpartandsudo resize2fson its device.
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat at sales@secureanycloud.com. We help with deployment, TLS termination with your own domain and certificate, changing the login credential, OPML import and export, and connecting Fever-compatible mobile apps. For refunds, contact sales@secureanycloud.com with your AWS account ID and subscription details.
Deploy on AWS
Launch yarr with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com