Tiny Tiny RSS on Heroku

This takes 5-10 minutes from start to finish :) The only prerequisite tools are git and the Heroku CLI.

  1. Download a local copy of TTRSS.

    git clone https://github.com/gothfox/Tiny-Tiny-RSS.git
    cd Tiny-Tiny-RSS
    
  2. Open config.php-dist, change the value of SESSION_CHECK_ADDRESS from 1 to 0, and save.

  3. Set up a new Heroku project. Replace $APP_NAME below with a custom project name, e.g. john-doe-ttrss to have your TTRSS instance live at https://john-doe-ttrss.herokuapp.com.

    heroku login
    heroku create $APP_NAME
    heroku addons:create heroku-postgresql:hobby-dev
    
  4. Add a few special files needed by Heroku.

    cat << EOM > Procfile
    web: ~/web-boot.sh
    EOM
    cat << EOM > composer.json
    {
      "require": {
        "ext-mbstring": "*"
      }
    }
    EOM
    cat << EOM > web-boot.sh
    sed -i 's/^ServerLimit 1/ServerLimit 8/' ~/.heroku/php/etc/apache2/httpd.conf
    sed -i 's/^MaxClients 1/MaxClients 8/' ~/.heroku/php/etc/apache2/httpd.conf
    vendor/bin/heroku-php-apache2
    EOM
    chmod +x web-boot.sh
    git add -A
    git commit -m "Add Heroku files"
    
  5. Push your local TTRSS repo to Heroku.

    git push heroku master
    
  6. Go to your app’s database in the Heroku Postgres dashboard and copy its connection settings into your new TTRSS instance, which can be found at the URL described in step 3.

  7. Complete the installation wizard by clicking Test configuration, Initialize database, and Save configuration.

  8. Log in to your TTRSS instance with the default username admin and password password.

Acknowledgements

This guide is based on Reuben Castelino’s impressively detailed blog post on the subject. I attempt to improve on his method by:

Extra Credit

I highly recommend the Feedly theme for TTRSS. You can easily convert it into a dark theme by going to Preferences > Customize stylesheet and pasting in the following:

body {
  -webkit-filter: invert(100%);
  filter: invert(100%);
}

img {
  -webkit-filter: invert(100%);
  filter: invert(100%);
}

.scoreWrap {
  display: none !important;
}