- {% if request.path.raw != '/1.0-payout' %}
- {% if not user.participant or user.participant.status_of_1_0_payout == 'pending-application' %}
+ {% if not request.path.raw.startswith('/fund-open-source/') %}
+
+
+ ★
+ {{ _( "{nowrap}Gratipay is a great way to{_nowrap} {nowrap}{a}fund open source!{_a}{_nowrap}"
+ , nowrap=''|safe
+ , _nowrap=' '|safe
+ , a=''|safe
+ , _a=' '|safe
+ ) }}
+ ★
+
+
+ {% endif %}
+
+ {% if user.participant and request.path.raw.startswith('/~/%s/' % user.participant.username) %}
+ {% if user.participant.status_of_1_0_payout == 'pending-application' %}
- {% elif user.participant and user.participant.status_of_1_0_payout in ('pending-review', 'pending-payout') %}
+ {% elif user.participant.status_of_1_0_payout in ('pending-review', 'pending-payout') %}
★
diff --git a/tests/py/test_librariesio.py b/tests/py/test_librariesio.py
new file mode 100644
index 0000000000..676aa732bf
--- /dev/null
+++ b/tests/py/test_librariesio.py
@@ -0,0 +1,8 @@
+from gratipay import inventory
+from gratipay.testing import Harness
+
+
+class Tests(Harness):
+
+ def test_inventory_python_returns_something(self):
+ inventory.python('Django')
diff --git a/www/assets/gratipay.css.spt b/www/assets/gratipay.css.spt
index a782bb8ebc..d4a1eace67 100644
--- a/www/assets/gratipay.css.spt
+++ b/www/assets/gratipay.css.spt
@@ -62,6 +62,7 @@
@import "scss/pages/homepage";
@import "scss/pages/history";
@import "scss/pages/identities";
+@import "scss/pages/fund-open-source";
@import "scss/pages/team";
@import "scss/pages/profile-edit";
@import "scss/pages/giving";
diff --git a/www/assets/librariesio.svg b/www/assets/librariesio.svg
new file mode 100644
index 0000000000..cd43976276
--- /dev/null
+++ b/www/assets/librariesio.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/fund-open-source/index.html.spt b/www/fund-open-source/index.html.spt
new file mode 100644
index 0000000000..29605d8737
--- /dev/null
+++ b/www/fund-open-source/index.html.spt
@@ -0,0 +1,55 @@
+from collections import OrderedDict
+[---]
+title = _("Fund Open Source")
+suppress_sidebar = True
+page_id = 'fund-open-source'
+[---]
+{% extends "templates/base.html" %}
+{% block head %}
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block content %}
+
+{{ _("Gratipay is a great way to fund the open source software projects that your company or organization depends on! Keep the open source ecosystem sustainable for years to come by locating the open source projects in your technology stack, and funding them all with one simple weekly payment on Gratipay.") }}
+
+{{ _("Step 1: Analyze Your Code") }}
+
+Powered by
+
+{{ _("Paste your package.json
for a report of your open source dependencies and their licenses." | safe) }}
+
+{{ _( "Want a sample? Try the {a}package.json
from npm itself{_a}"|safe
+ , a=""|safe
+ , _a=" "|safe
+ ) }}.
+
+
+{% endblock %}
+
+{% block scripts %}
+
+{% endblock %}
diff --git a/www/fund-open-source/report.spt b/www/fund-open-source/report.spt
new file mode 100644
index 0000000000..62729192c7
--- /dev/null
+++ b/www/fund-open-source/report.spt
@@ -0,0 +1,33 @@
+from aspen import Response
+from gratipay import librariesio
+[---]
+if request.method != 'POST':
+ website.redirect('/fund-open-source/')
+
+package_json = request.body['package_json']
+names = librariesio.resolve(package_json)
+suppress_sidebar = True
+title = _("Your Open Source Inventory")
+page_id = 'fund-open-source'
+[---] text/html
+{% extends "templates/base.html" %}
+
+{% block content %}
+
+Powered by
+
+{{ _("Step 2: Review Inventory and Set Amount") }}
+
+
+ $
+ per week
+ Go
+
+
+
+ {% for name in names %}
+ {{ name }}
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/www/index.html.spt b/www/index.html.spt
index 309a2886df..a927a573b2 100644
--- a/www/index.html.spt
+++ b/www/index.html.spt
@@ -40,6 +40,7 @@ for key, tab in tabs.items():
title = _("Teams")
suppress_sidebar = True
suppress_welcome = 'suppress-welcome' in request.cookie
+page_id = 'homepage'
[---]
{% extends "templates/base.html" %}
{% block head_early %}