AOF is a server application that periodically fetches web comics, websites, and any other scrapeable data sources on the web like an RSS reader.

Provides updates where RSS falls short

RSS feeds require effort on the website authors’ part to be set up to work properly. On many websites, the RSS feed may not be very good, or may not exist at all.

AOF uses arbitrary scripts to load content from any data source accessible over HTTP. If you know some Javascript, you can write a custom scraper for anything on the web!

Screenshot of the web app Screenshot of the web app

Comes with a web app

AOF comes with a progressive web app that can be used like an RSS reader. If a script supports loading content pages, content can even be read directly within the app.

Activity Monitor showing no CPU usage and 7 MB memory usage Activity Monitor showing no CPU usage and 7 MB memory usage

Relatively lightweight

AOF is designed to use very few resources when idle, and not to be a burden on servers it might be running on.

In fact, AOF is the second iteration of a previous application that was written in Node.js and using a lot more resources.

Caveats

This application is still, like, pre-alpha/alpha software, and comes with many bugs. There are also some more specific considerations:

Detailed Setup Guide

I wouldn’t exactly recommend using this app, but you can do it!! Please report bugs and annoyances to wherever (e.g. GitHub).

  1. Download a prebuilt binary or build from source

    Download binary (Linux x64) Download source

    (I have no idea if the prebuilt binary is portable. If you get weird dyld errors in the following steps, try building from source.)

    To build from source:

    • Clone the git repository: git clone --recursive https://github.com/cpsdqs/aof
    • Install npm and cargo, if required.
    • Run ./build.sh from the project directory.
    • Wait like 10 minutes.
    • There should now be a build.tar.gz file in the target directory.
  2. Set up the AOF server

    • Extract build.tar.gz to someplace nice to find the aof binary and the static directory.
    • Go to the directory with the aof binary.
    • Create a configuration file with ./aof generate-config.
    • Important! Open the configuration file and put something random in private_key.
    • Edit other parts of the configuration file if you would like!
    • You can also edit the files in the static directory, such as the terms of service or the privacy policy.

    The server can then be started with ./aof—but you probably don‘t want to start it this way.

  3. Set up a reverse proxy

    AOF is designed to run behind a reverse proxy. Please don’t expose the server directly!

    If you are using nginx, you can add this to your nginx site configuration:

    location /WHEREVER/ {
        proxy_pass http://127.0.0.1:2639; # this is the default address; check to see if it matches your config!
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    
        add_header Content-Security-Policy "default-src 'none'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; img-src 'self' data:; connect-src 'self' wss://this.websites.domain.net; child-src 'self' blob: https://www.youtube-nocookie.com; manifest-src 'self';" always;
    }
                        

    Make sure to set the base_path value in your config file to the location the server is accessible from (/WHEREVER/ in the example above).

  4. Set up a systemd service

    If you would like the AOF server to stay available when your operating system restarts, you might want to set up a systemd service (if your system is using systemd). It basically just needs to run the aof binary from its directory.

    I don’t really understand systemd, but placing the following in a file at /etc/systemd/system/aof.service seems to work:

    [Unit]
    Description=AOF
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/path/to/directory/aof
    WorkingDirectory=/path/to/directory/
    User=<some user that can write to that directory>
    Restart=always
    RestartSec=1
    
    [Install]
    WantedBy=multi-user.target

    Then run sudo systemctl enable aof to start it on boot, and sudo systemctl start aof to start the service now.

  5. Create a user account

    Ideally, you should now be able to see a simple landing page if you go to the location set up in the reverse proxy. If not, something went amiss in the previous two steps.

    To create a registration token for use in the registration form, run ./aof create-token in the directory with the aof binary.

Getting Started

Adding A Domain Script

After logging in, you can see two items in the sidebar:

To get started, open the domains list and create a new domain for the website you would like to subscribe to, and press Edit to edit the domain script.

You can copy-paste one of these example scripts. Example scripts are available for:

If you would like to write your own script, you can find more extensive documentation about the scripting API (including caveats) in the “Documentation” link at the bottom of the landing page.

Should there be other users on your server, you can also choose to share the script by checking the Public checkbox.

Subscribing to A Source

Now that there’s a domain script set up, you can find a source simply by typing its domain abbreviation followed by its path into the search field. For example, if you have the WEBTOON domain script set up with the abbreviation “LWT”, you could type “LWT challenge/123456” to load a comic.

The item shown will probably have a button labeled “never”—this is the time this source was last loaded. You can tap it to trigger the domain script to fetch the contents.

If you open the item, you will find a button labeled “Subscribe”. Note that sources will only be loaded regularly if someone is subscribed to them.

To export the source as an RSS feed, subscribe to it and tap the RSS icon. You will need to create an RSS key, which authorizes the RSS feed’s link to use your user account. Note that RSS feeds are still a bit janky! Also, unfortunately, RSS readers generally don’t seem too keen on displaying any sort of complex HTML.

Deleting AOF

The server is actually rather portable! All relevant files are stored in the application directory, including the database (by default, at least). To delete AOF, simply delete its directory, and make sure to also remove any proxies and services.