f1d3e77df45ddc701ecf843afbea250563607aba
   1After Google changed the new tab page of Chrome to an ugly array of circular icons (around mid 2016), I looked around for a better new tab page extension. The best I could find was [Start Clean](https://startclean.github.io/), but it had several issues (I don't remember exactly - I think there were various bugs). A fork of Start Clean by [shadowfacts](https://github.com/shadowfacts/Chrome-Extension) fixed some small issues and added the favicons which was rather nice, but for some reason (???) this fork makes links open in a new tab.
   2
   3Initially I forked shadowfacts' version to make links open in the current tab. That worked fine for a while, but I have since rewritten the extension to have much more flexibility in adding/removing links and categories. The UI is also much improved. Here is a summary of the changes I've made:
   4
   5* Links open in the current tab
   6* Background, foreground and hover colours are configurable
   7* Removed ueslesss search bar and apps sections (all I want is links to common sites)
   8* You can now have as many columns of links as you like, and reorder them with drag and drop
   9* Added new "edit mode" where you can rearrange/add/remove/rename columns
  10* Added basic keyboard shortcuts & tab indices
  11- Uses browser-default sans serif font rather than locally packaged font
  12- Improved settings UI
  13- Use the more secure `XMLHttpRequest` method for retrieving favicon blobs
  14- Reduced permission requirements on installation
  15- Much cleaner code (well, as much as possible - it is Javascript after all)
  16
  17The sorting of links is managed by [SortableJS](https://github.com/SortableJS/Sortable). If I was writing this from scratch again I would use native HTML5 drag and drop, but I guess if it ain't broke don't fix it. I did end up implementing HTML5 drag and drop for the movement of columns though.
  18
  19Favicons for websites are obtained from Google's S2 API. One day I might upgrade to [Favicon Kit](https://faviconkit.com/) which is less centralised. This is the only external object loaded, but it triggers some scary warning in Chrome which says that it can "change data on all websites you visit" etc.
  20
  21## Installation
  22
  23Unfortunately installation is a little protracted because Google wants all extensions to be distributed through the Chrome Web Store. Apparently this is enforced to increase security, but I have to pay to upload an extension (nice bait Google) so I see no reason to upload it.
  24
  25You can still install it as a local extension in developer mode:
  26
  271. Go to <chrome://extensions> and turn on developer mode (top right)
  282. Download <a href="../plain/build/newtab.crx" download>build/newtab.crx</a> ("Save link as...", don't install it straight away - see below)
  293. Drag the file onto the extensions page to install it
  30
  31Opening the crx file using Chrome's default file handler causes a "CRX_REQUIRED_PROOF_MISSING" error because Chrome now only allows extensions obtained from their store. However, you can drag and drop it onto the extensions page and that seems to bypass the verification. More info [here](https://support.google.com/chrome/thread/3125155?hl=en).
  32
  33## Building
  34
  35For the time being you can run the extension as a local "unpacked" extension, but if you make modifications you may like to make a distributible crx file. You can do this with the included build script - just run `make all` in the root directory. You'll need your own private key in newtab.pem in the root directory (Chrome can generate this from the Extensions page).