Metadata-Version: 2.1
Name: understory
Version: 0.0.45
Summary: The tools that power the canopy
License: AGPL-3.0-or-later
Author: Angelo Gladding
Author-email: angelo@lahacker.net
Requires-Python: >=3.9,<3.10
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Requires-Dist: Pillow (>=8.3.1,<9.0.0)
Requires-Dist: PyVirtualDisplay (>=2.2,<3.0)
Requires-Dist: Pygments (>=2.9.0,<3.0.0)
Requires-Dist: Unidecode (>=1.2.0,<2.0.0)
Requires-Dist: acme-tiny (>=4.1.0,<5.0.0)
Requires-Dist: argcomplete (>=1.12.3,<2.0.0)
Requires-Dist: cssselect (>=1.1.0,<2.0.0)
Requires-Dist: dnspython (>=2.1.0,<3.0.0)
Requires-Dist: emoji (>=1.2.0,<2.0.0)
Requires-Dist: feedparser (>=6.0.8,<7.0.0)
Requires-Dist: gevent (>=21.1.2,<22.0.0)
Requires-Dist: gunicorn (>=20.1.0,<21.0.0)
Requires-Dist: hstspreload (>=2021.7.5,<2022.0.0)
Requires-Dist: httpagentparser (>=1.9.1,<2.0.0)
Requires-Dist: jsonpatch (>=1.32,<2.0)
Requires-Dist: lxml (>=4.6.3,<5.0.0)
Requires-Dist: mf2py (>=1.1.2,<2.0.0)
Requires-Dist: mf2util (>=0.5.1,<0.6.0)
Requires-Dist: mimeparse (>=0.1.3,<0.2.0)
Requires-Dist: networkx (>=2.6.1,<3.0.0)
Requires-Dist: pendulum (>=2.1.2,<3.0.0)
Requires-Dist: pycryptodome (>=3.10.1,<4.0.0)
Requires-Dist: pyscreenshot (>=3.0,<4.0)
Requires-Dist: radon (>=5.0.1,<6.0.0)
Requires-Dist: redis (>=3.5.3,<4.0.0)
Requires-Dist: regex (>=2021.7.6,<2022.0.0)
Requires-Dist: requests (>=2.25.1,<3.0.0)
Requires-Dist: scrypt (>=0.8.18,<0.9.0)
Requires-Dist: selenium (>=3.141.0,<4.0.0)
Requires-Dist: semver (>=2.13.0,<3.0.0)
Requires-Dist: sh (>=1.14.2,<2.0.0)
Requires-Dist: vobject (>=0.9.6,<0.10.0)
Requires-Dist: watchdog (>=2.1.3,<3.0.0)
Project-URL: Homepage, https://understory.stream
Project-URL: Issues, https://github.com/canopy/understory/issues
Description-Content-Type: text/markdown

# understory
Tools to power your personal website

## An IndieWeb-compatible personal website packaged and deployed

Install [Poetry](https://python-poetry.org).

Clone your empty website repository and descend into it. *If you
use a **private** GitHub repository your changes will be deployed through
GitHub. If you use a **public** repository your changes will be deployed
through PyPI.*

Initialize your project and add understory as a dependency.

    poetry init
    poetry add understory

Create a file `site.py`:

    from understory import indieweb
    
    app = indieweb.site()

Add your site's app as an entry point in your `pyproject.toml`:

    poetry run web install site:app AliceAnderson

Serve your website locally in development mode:

    poetry run web serve AliceAnderson

Open <a href=http://localhost:9000>localhost:9000</a> in your browser.

*Develop.* For example, add a custom route:

    import random
    
    @app.route(r"hello")
    class SayHello:
        return random.choice(["How you doin'?", "What's happening?", "What's up?"])

To publish:

    poetry run pkg publish patch

To deploy:

    poetry run web deploy

    ██╗   ██╗███╗   ██╗██████╗ ███████╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ██╗   ██╗
    ██║   ██║████╗  ██║██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗╚██╗ ██╔╝
    ██║   ██║██╔██╗ ██║██║  ██║█████╗  ██████╔╝███████╗   ██║   ██║   ██║██████╔╝ ╚████╔╝
    ██║   ██║██║╚██╗██║██║  ██║██╔══╝  ██╔══██╗╚════██║   ██║   ██║   ██║██╔══██╗  ╚██╔╝
    ╚██████╔╝██║ ╚████║██████╔╝███████╗██║  ██║███████║   ██║   ╚██████╔╝██║  ██║   ██║
     ╚═════╝ ╚═╝  ╚═══╝╚═════╝ ╚══════╝╚═╝  ╚═╝╚══════╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝   ╚═╝

