Trying to avoid browser dependency.


Web browsers are almost the only GUI programs I use. They are also the most bloated and vulnerable programs one can have installed on desktop/laptop.

Those browsers have to handle a lot of external code that comes from the websites visited. Not only static html (which is already problematic in some cases) but also JavaScript, which has to be interpreted and run in your machine with the obvious risk.

Is not only a matter of security, but also privacy. Almost every website out there is tracking you in some way or another. Or worst, is using one of the big companies to track you, which makes their profiling even easier ...

And then there's the ups! moments like the recent Firefox bug that deactivated all the user plugins. The worst part in my opinion is trying to fix the thing using the "Studies system", which already has a reputation ...

The other big browser, Chrome is not free of all this stuff. They spy on you directly without even hiding it.

Here you can find a series of techniques to use web browsers as little as possible.

Basic browsing

For basic stuff, like sites that are mostly text as Wikipedia or others, one can use a text based browser like lynx. This becomes impossible with sites that make heavy use of JavaScript or sites that require captcha to login ... In that case, the only alternative I can think of is use a conventional browser with plugins like uBlock Origin or Privacy Badger.


There are some ways of have your bookmarks totally independent from a browser. I choose to use shiori. It's a terminal utility that you can use to add, search, or open bookmarks. It also has a web interface if you prefer that.

A simple search can be done like this:

shiori search keyword

You cal also specify tags in the search with -t. Then you can open it in your default browser with:

shiori open id

Take a look at help, it's really easy.

You can also import/export bookmarks in html format as most browsers understand, so migrating to/from shiori is quite easy.


Whenever I can, I use curl, ftp(1) or wget from the command line with direct links. If using a text based browser, then it should have its own way of dealing with downloads.

Some sites do not like user that do not use conventional browsers, as those are more difficult to track (not impossible, just a bit more difficult). Some of them block requests that don't come from "regular" user agents, so it's usually a good idea to configure your tools to identify themselves as Mozilla Firefox or Google Chrome. Most of the times that is enough.

If using bittorrent to download stuff, the problem is to find a torrent website that is not completely full of crap and you can just take the magnet links (because you should be using magnet links). Try to use API calls if your favourite tracker allows it.

I usually use rarbg. You have a lot of alternatives to interact with its api. A long time ago I did some Perl module for it called Rarbg::torrentapi. Then I use a sort of interactive script to search torrents on the terminal, it pairs with transmission to send the magnet links directly to the torrent client.

#!/usr/bin/env perl

use v5.24;
use strict;
use warnings;
use Rarbg::torrentapi;
use Getopt::Long;
no warnings 'experimental';

sub usage {
      "Usage: $0 [--list] [--search <string>] [--categories <category>] [--limit <n>]";
    say "\t--list\t\t\tlists last added torrents sorted by seeds.";
      "\t--search <string>\tsearches for <string> and returns sorted by seeds";
      "\t--category [movies|tv|music|xxxx]\tuses those categories (defaults to movies)";
    say "\t--limit [25|50|100]\tShows 'n' results (defaults to 25)";
    exit 1;

my $tapi    = Rarbg::torrentapi->new();
my $counter = 0;
my $search  = "";
my $list;
my $result;
my $raw_category = '';
my $category;
my $limit = 25;

    "search=s"   => \$search,
    "list"       => \$list,
    "category=s" => \$raw_category,
    "limit=i"    => \$limit
) or usage();

given ($raw_category) {
    when ( $_ eq 'movies' or $_ eq 'tv' ) {
        $category = $raw_category;
    when ( $_ eq 'music' ) {
        $category = '2;23;24;25;26';
    default {
        $category = 'movies'

if ($search) {
    $result = $tapi->search(
        {   sort          => 'seeders',
            limit         => $limit,
            category      => $category,
            search_string => $search
elsif ($list) {
    $result = $tapi->list(
        {   sort     => 'seeders',
            limit    => $limit,
            category => $category
else {

if ( ref($result) eq 'ARRAY' ) {
    foreach my $t ( @{$result} ) {
            "%d -> %s (%.2f GB # %d seeds)\n",
            $counter, $t->title, $t->size / 1073741824,
elsif ( ref($result) eq 'Rarbg::torrentapi::Error' ) {
    die "[*] We got an error: $result->{error}";
else {
    die "[*] Unexpected Error";

print "Input selection, separated by spaces. (Ctrl+C to quit) ";
my $selection = <STDIN>;
chomp $selection;

if ( $selection =~ m/\d{1,2} ?/ ) {
    my @selections = split( / /, $selection );
    foreach my $s (@selections) {
        say "[*] You selected: " . $result->[$s]->title;
        say "  [-] sending magnet to transmission:\n"
          . $result->[$s]->download;
        my $magnet = $result->[$s]->download;
        `transmission-remote MYTORRENTHOST --authenv -a $magnet`;
else {
    die "selection is not a number!";

RSS feeds

The best solution I found for this is newsboat. You can use it directly (providing a list of feeds to pull from) or connecting it to a supported external service like ttrss. I happen to have access to a ttrss installation, so I use that and also have the Android app on my phone. That way I keep track of what I have read/seen.

newsboat allows you to configure the browser it will use to open links. I find useful to have a wrapper script as configured browser, so it routes the different kinds of links to different programs, and defaults to a web browser if needed. I also use it for other stuff on the command line, is pretty convenient.

#!/usr/bin/env bash

videoFiles="mkv mp4 gif webm mpd"
audioFiles="mp3 flac"
imageFiles="png jpg jpeg"

if echo "$imageFiles" | grep -q -w "$ext"; then
    feh -q "$1" & disown
elif echo "$videoFiles" | grep -q -w "$ext"; then
    mpv --really-quiet --pause --keep-open "$1" & disown
elif echo "$audioFiles" | grep -q -w "$ext"; then
    # I like podcasts and the like to open on a small terminal
    urxvtc -geometry 60x6 -e mpv --pause --keep-open "$1" & disown
elif echo "$@" | grep -q -E "$videoSites"; then
    mpv --really-quiet --pause "$1" & disown
    firefox --private-window "$1" > /dev/null 2>&1 & disown

And then you tell newsboat to use it like so:

browser "/path/to/my/script/ %u"


You can use feh to see links to images. It just works.

It can also be used to set up your background image on simple window managers, invoked from .xinitrc or .xsession

Videos (and streaming)

A good alternative to watch videos and streaming on the browser is mpv. It has integration with youtube-dl (which not only "understands" youtube links, but many many more). With a bit of configuration you won't need the browser for video any more. Here is my ~/.config/mpv/mpv.conf

# sound works better like this on OpenBSD
# try gpu accelerated video
# full screen by default
# user agent ... because the web sucks.
user-agent="Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0"
# moarrr cache
# no 4k monitor so limit to best 1080
ytdl-format=bestvideo[height <= 1080]+bestaudio/best
# do not send that through the HE tunnel (ignore if you do not have this)

Keep in mind that some streams might not work with mpv under OpenBSD (my OS of choice). That's because ffmpeg does not come with DASH demuxing compiled in by default. I sent a patch to the port maintainer some time ago. I hope it will be commited soon. In the mean time contact me if you need that functionality and I'll send you the patch and instructions.


So those are the programs I use to try to stay away from the browser as much as possible. If you have other alternatives or suggestions, contact me and I'll add them here.

Have any comments ? Send an email to the comments address.