From IndieWeb
Jump to: navigation, search

The Canopy is a decentralized social space underpinned by the canopy platform written in Python by Angelo Gladding that helps you create and fully manage a personal identity site with extensive support for IndieWeb features and API interoperability.

See also: projects#Canopy


  • Representative h-card that incorporates components as you install and use plugins:
    • bio (with about)
    • location (with locations)
    • twitter/email/phone (with contact)
  • Access control separation of users and owner. Resources can be public or private.
  • Simple automated background task queue for updating:
    • email inbox
    • contacts' info
    • weather
  • API credential management. Plugins define required APIs and /admin store credentials and manages overlapping requirements gracefully.
  • Usable without javascript or css. Manually tested in w3m.
  • In-code documentation resurfaces in /help pages.

Working on

  • Core features: generic post stream, search & tagging mechanics.
  • Built-in user login a la IndieAuth.
  • Minimally fleshing out and polishing initial plugins.
  • Documentation and tests. Continuous integration via automated real world deployment and engagement with fictional identities (at different hosts and with different simulated use cases).


  • A complete web-based personal operating system. AGPL'd and redistributes its own code. Fork your own complete system from an existing system.
  • Secure. Fully defended against the OWASP standard. Peer-reviewed. Automatic TLS via LetsEncrypt, HSTS and HPKP (with self-signed cert fallback). Use of SSH and PGP keys where relevant.
  • Safe. Zero-loss data layer even in unreliable shared host environment. Fully automated backups of database and assets to Tor + VPN on capable hosts.
  • Host-agnostic. Tested on at least three low-tier and three high-tier providers. Tested on vanilla Debian stable.
  • Alpha launch for demo by IndieWebCamp LA (Nov 4)


I believe that every line of code matters and that source code should read like a book. Python lends itself well to readability and I strive to use Pythonic idioms whenever and wherever possible to further my pursuit. I also believe that large projects become unwieldy as features are added and edge cases are handled without refactoring. Thusly pre-alpha and alpha stages of this project will be frequently refactored outside of source control until a balance of stability and succinctness has been met.

Lines of Code

  • Sep 10, 2016: 15k (12 core + 5 plugin packages; still limited functionality, almost no tests)

DISCLAIMER simplistic line counting through pss -f | xargs wc -l includes shipped vendor code without consideration. PHP projects often ship all requirements whereas Python/Ruby projects often leverage a package distribution system. The following line counts are rough.

Sep 10, 2016

  • bridgy: 22k
  • django: 480k
  • DarkMatter: 19k
  • Dobrado: 160k
  • flask: 27k
  • Known: 102k
  • Mailpile: 90k
  • redwind: 13k
  • woodwind: 3k
  • Wordpress: 505k
  • wordpress-indieweb: 5k


Currently bootstrapped. A fully functional and feature frozen beta will provide for an optional recurring Bitcoin-based microdonation on the order of $1/mo.

Live Examples

IndieWeb community members using canopy as their primary site:


  • one-click install
    • builds and installs important libraries to support the inclusion of reliable and up-to-date requirements
    • installs, configures, runs and manages database and web servers
    • configures an isolated virtual Python environment and populates with editable source code distributions for seamless development
  • full-featured
    • dynamically rendered
    • built-in background task queue
    • API management built into core
  • adheres to minimalist philosophies
    • DRY; less is more
    • progressive enhancement
    • js;dr



canopy depends on the following free and open source software packages.


The build script will fetch and install the following C-based packages and Python-based wrappers:

Redis, Nginx, VirtualEnv, pip, PyCrypto, uwsgi, libxml, libxslt, lxml, libicu, pyicu


pkg, src, term, kv, uri, mkup, mf, mkdn, mm, web, solarized


INSTALLATION IS IN A FRAGILE STATE. Advanced users only should attempt at this point but don't hesitate to contact me with any questions.


BEWARE this project is currently in pre-alpha. The following script will change often and could damage existing data in and around the directory in which it is run. That said, it should fully confine itself to a directory named tree in the current working directory and safeguard against overwriting an existing tree directory. Currently tested and functional on a WebFaction VPS.



TODO WebFaction custom install script to perform install directly from Control Panel.

Other Host



  1. Fork the canopy project, its 11 internal dependencies and the install script on Github.
  2. Ensure your host machine's SSH public key is added to your Github account.

Clone the install script locally and you can then execute the script interactively or by passing command line arguments. For a complete description of options run sh c01eb1a1707804864a6235117e3e886f/ -h.


A core install makes few assumptions about your intended use and thusly comes with an empty trunk. It is expected that you install branches to add functionality. The trunk and its branches comprise the understory which ultimately supports the resources, foliage and flowers, found in the canopy.

APIs: IMAP/SMTP, Twilio, Twitter, Github, Google Maps, Yelp, Coinbase, WeatherUnderground, [Credit Union]


  • audio
  • pages
  • sites
  • video

APIs: Uber, Zoneedit, Facebook, Keybase, Flickr, Lanyrd, Youtube,, ..


Navigate to /admin/applications and provide a URL in the following format:

where PLUGIN is the desired plugin name.

Developer Install

  1. Fork the desired plugin on Github.
  2. Ensure your host machine's SSH public key is added to your Github account.

Then follow the Non-Developer Install instructions above instead providing a URL in the following format:


where USERNAME is your Github username.

See Also