Browser bookmarks has been an essential part of browsing for me. But once multiple browsers started appearing, I found that I couldn’t share my bookmarks across browsers.

And then appeared. And they even had a free tier! That was such a lifesaver. But like all good things it came to an end and I had to choose something different. I exported all my bookmarks to Diigo and had been using it for ages.

But from the time I got more comfortable with the server side of things, I wanted get off Diigo as well. I didn’t want to face the same problem again in the future.

I came across Shaarli some years ago and always wanted to install it on my own server. Shaarli seemed to always get recommended as an easy-to-install software.

To install it, I had to use something called Composer which I had never heard of before. After some hours of hunting around I finally managed to do something like this –

Install Composer

Following commands performed as root

curl -s | php

Running this gave me an output like this

All settings correct for using Composer

Composer (version 1.7.3) successfully installed to: <current folder>/composer.phar
Use it: php composer.phar

I had to move composer to a directory so that it could be used globally, and then update it

mv composer.phar to /usr/bin
composer update

Install Shaarli

Following commands run as normal user

I followed the steps on the Shaarli github page to install.

git clone -b stable /path/to/shaarli/
cd /path/to/shaarli/
composer install --no-dev --prefer-dist

What was also needed was to make certain directories writable, so –

chmod -R 777 cache data pagecache tmp

And that was it.

Configuring Nginx

The nginx configuration ended up (after a few trials), like this –

server {

  listen			80;
  root 			/path/to/shaarli;

  autoindex off;
  client_max_body_size 4M;
  client_body_buffer_size 128k;
  index index.html index.htm index.php;
  access_log	/var/log/nginx/shaarli_access.log;
  error_log	/var/log/nginx/shaarli_error.log;

  # Pass PHP scripts to PHP-FPM
  location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index   index.php;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param   SERVER_NAME $host;
    fastcgi_param   PATH_INFO $uri;
    fastcgi_intercept_errors        on;
    fastcgi_ignore_client_abort     off;
    fastcgi_connect_timeout         60;
    fastcgi_send_timeout            180;
    fastcgi_read_timeout            180;
    fastcgi_buffer_size             128k;
    fastcgi_buffers         4       256k;
    fastcgi_busy_buffers_size       256k;
    fastcgi_temp_file_write_size    256k;

  location ~ /(data|conf|bin|inc)/ {
    deny all;

  location ~ /\.ht {
    deny	all;