on master help sign in
add userspace apprenticeships
2922b98Josh Lehman
content/grants/ua-collaborative-text-editor.mdnew file+27
@@ -0,0 +1,27 @@
1++++
2+title = "Apprenticeship: Collaborative text editor and annotator"
3+date = 2021-05-27
4+[taxonomies]
5+grant_type = ["apprenticeships"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A line-based editor for looking at text and code."
10+reward = 1
11+mentor = "~timluc-miptev"
12+assignee = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0019&prefill_Grant+Name=Collaborative%20text%20editor%20and%20annotator"
15++++
16+
17+A line-based editor for looking at text and code. Can be organized by projects. Allows multiple people to edit, but can use locking for now.
18+
19+Could store edits as diffs. Graph-store is probably fine for this, but a native storage format could work as well and would be good to think through tradeoffs. Interesting extensions would be things like line annotations.
20+
21+This project is a good introduction to social apps in Urbit, and could become the framework for a larger product if the apprenticeship prototype works.
22+
23+### User Stories
24+As a user I can:
25+* create projects
26+* create text files within those projects
27+* invite other users to my project, with varying permissions
content/grants/ua-filesharer.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+title = "Apprenticeship: Filesharer"
3+date = 2021-05-27
4+[taxonomies]
5+grant_type = ["apprenticeships"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "An application that allows peers to upload files to managed storage, either on or off Urbit, and share files with each other."
10+reward = 1
11+mentor = "~timluc-miptev"
12+assignee = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0022&prefill_Grant+Name=Filesharer"
15++++
16+
17+An application that allows peers to upload files to managed storage, either on or off Urbit, and share files with each other. Can also add direct file-sharing via something like WebRTC in the future when that's ready.
18+
19+### User Stories
20+As a user, I can:
21+* add custom marks to store new filetypes in Urbit
22+* choose a fileserver to connect to with LFS or S3 for larger binaries
23+* add files to my system, with metadata
24+* specify the users and groups that have access to my files
25+* view the files I have access to on other ships
26+* download files to my local machine
content/grants/ua-heads-up-poker.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Apprenticeship: Heads-up poker"
3+date = 2021-05-27
4+[taxonomies]
5+grant_type = ["apprenticeships"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A fun client app that would be a good way to get acquainted with Urbit's networking and p2p abilities."
10+reward = 1
11+mentor = "~timluc-miptev"
12+assignee = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0021&prefill_Grant+Name=Heads-up%20poker"
15++++
16+
17+A fun client app that would be a good way to get acquainted with Urbit's networking and p2p abilities. While it would be possible to create a fully decentralized version that uses [mental poker](https://en.wikipedia.org/wiki/Mental_poker) [algorithms](https://github.com/kripod/mental-poker) to make the game fully p2p, it is probably more tractable initially to implement the game with a centralized server.
18+
19+The game can be implemented such that the central server only handles queries about current deck state, and so could be swapped out for a solution with no trusted third party at a later time. Everything else can be handled player-side, including signing attestations of game state at different points.
20+
21+### User Stories
22+As a gameserver admin I can:
23+* set up a server to handle shuffling/dealing
24+* take API calls from players who want to initiate a game.
25+
26+As a player, I can:
27+* connect to another player with the app to initiate a game
28+* specify which gameserver I trust to handle card shuffling/dealing
29+* play iterated hands of poker
30+* update a game state that is either tournament-based (first to win all the chips) or cash-based (continually updating stacks of chips on each side, possibly with injections of money along the way)
content/grants/ua-invoice-system.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Apprenticeship: Invoice system"
3+date = 2021-05-27
4+[taxonomies]
5+grant_type = ["apprenticeships"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A system to request and record payments made and received."
10+reward = 1
11+mentor = "~timluc-miptev"
12+assignee = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0020&prefill_Grant+Name=Invoice%20system"
15++++
16+
17+A system to request and record payments made and received. Currently, Urbit ships can send payments to each other via Bitcoin, record who made the payment, and verify its presence. However, there is no system to link those payments to records of what they were for.
18+
19+This invoice system will be needed in Urbit at some point, and so this project has potential to be extended as a grants project in the future if an initial version works well.
20+
21+### User Stories
22+As a user, I can:
23+* specify on-Urbit payment methods from which I will make or receive payments
24+* request a specific payment amount from another user, specifying the method(s) that can be used for payment
25+* tell a user that you've made a payment, with reference to some receipt that they can verify.
26+* receive payments with app and time metadata
27+
28+As another application on a user's Urbit I can:
29+* generate invoices to be sent to other users
30+* query the invoice store to see which payments have been made for me
content/grants/ua-marketplace.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "Apprenticeship: Marketplace"
3+date = 2021-05-27
4+[taxonomies]
5+grant_type = ["apprenticeships"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A marketplace in which users can post items for sale and browse goods for sale by other users."
10+reward = 1
11+mentor = "~timluc-miptev"
12+assignee = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0018&prefill_Grant+Name=Marketplace"
15++++
16+
17+A marketplace in which users can post goods for sale and browse goods for sale by other users. Probably similar in feel to Craigslist. A lot of design will be required here, since the space of possible things to make is very big.
18+
19+The most likely architecture has users hosting their items, with aggregator-type services listing and indexing items from multiple users. It's also possible that sales will be able to designate escrow parties for money or goods, and/or arbitrator parties to decide when a sale is complete.
20+
21+Simple versions of this can be implemented to learn userspace programming, and a particular good design could become its own product.
22+
23+
24+## User Stories
25+
26+As a user I can:
27+
28+- post goods I want to sell
29+- browse goods other users have for sale
30+- curate marketplaces other users can sell in
31+- buy products
32+- sell products
33+- have a 3rd party confirm when a sale is complete
34+
templates/grant_type/apprenticeships.html+47−7
@@ -17,6 +17,12 @@
17{% endblock image %}
17{% endblock image %}
18
18
19{% block content %}
19{% block content %}
20+ {% set taxonomy = get_taxonomy(kind="grant_type") %}
21+ {% for t in taxonomy.items %}
22+ {% if t.name == 'apprenticeships' %}
23+ {% set_global term = t %}
24+ {% endif %}
25+ {% endfor %}
20
26
21<!-- header -->
27<!-- header -->
22<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
28<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
@@ -30,12 +36,46 @@
30<!-- content -->
36<!-- content -->
31<section class="full c4-10-lg pt4 lh-copy">
37<section class="full c4-10-lg pt4 lh-copy">
32 <h1>Apprenticeships</h1>
38 <h1>Apprenticeships</h1>
33− <p>Apprenticeships pair a community member with an Urbit core developer. The apprentice works on a specific scope of work under the tutelage of the core developer. The developer offers guidance and review of the project, and the apprentice contributes directly to the Urbit project. The apprentice also receives compensation in the form of address space.</p>
39+ <p>
34− <p>Apprenticeships are offered on a limited basis. Email <a href="mailto:josh@urbit.org">josh@urbit.org</a> to register your interest.</p>
40+ We often get inbound inquiries that go something like: "I'm somewhat
35− <br />
41+ familiar with Hoon and I've gone through all the tutorials. What's a project
36− <br />
42+ I can work on?" Apprenticeships are our answer to that.
37− <br />
43+ </p>
38− <br />
44+ <p>
45+ Apprenticeships onboard developers to the Urbit programming community. This
46+ community has a wide variety of tasks, and uses multiple languages to
47+ program the runtime and frontends, although Urbit userspace and kernel work
48+ is always Hoon.
49+ </p>
50+ <p>
51+ There are two kinds of apprenticeships: <b>userspace apprenticeships</b>,
52+ which are oriented towards developers that are looking to build applications
53+ on Urbit&mdash;and <b>kernelspace apprenticeships</b>, which are oriented
54+ towards more experienced Urbit developers that want to take a stab at
55+ working on Urbit core directly.
56+ </p>
57+ <p>Apprenticeships proceed in two stages:</p>
58+ <ol>
59+ <li>The prospective apprentice interviews with a Foundation director.</li>
60+ <li>If interview is passed, the apprentice works with an Urbit core or
61+ userspace developer. The apprentice works on a specific scope of work under
62+ the tutelage of the developer.</li>
63+ </ol>
64+ <p>The developer offers guidance and review of the project, and the apprentice
65+ contributes directly to the Urbit project. The apprentice also receives
66+ compensation in the form of address space when the project is completed. After
67+ that, the apprentice should be equipped to contribute further to substantial
68+ grants or even apply for a job in some cases.</p>
69+ <p>The resource we are trying to grow is developers, not lines of code. As a
70+ result, apprentice projects can be focused more on developer onboarding than
71+ immediate utility to Urbit, in order to speed the learning process. Check out
72+ available apprenticeships below:</p>
73+
74+ {% for page in term.pages %}
75+ {% if not page.extra.canceled %}
76+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
77+ {% endif %}
78+ {% endfor %}
39</section>
79</section>
40{% include "partials/footer.html" %}
80{% include "partials/footer.html" %}
41−{% endblock content %}
81+{% endblock content %}
templates/grants/grant.html+13−5
@@ -34,10 +34,22 @@
34 <img class="db mv2 obj-cover w-100 ba" src="{{ page.extra.image }}" />
34 <img class="db mv2 obj-cover w-100 ba" src="{{ page.extra.image }}" />
35 {% endif %}
35 {% endif %}
36
36
37+ {% if page.extra.mentor %}
38+ <span class="db mb1">Mentor: <span class="mono">{{ page.extra.mentor }}</span></span>
39+ {% endif %}
40+
37 {% if page.extra.assignee %}
41 {% if page.extra.assignee %}
42+ <span class="db mb1">
43+ Worker(s):
38− <span class="db mb1">{{ page.extra.assignee }}</span>
44+ <span class="mono">{{ page.extra.assignee }}</span>
45+ </span>
46+ {% endif %}
47+
48+ {% if page.extra.reward %}
49+ <span class="db mb1">Reward: {{ page.extra.reward }} Stars</span>
39 {% endif %}
50 {% endif %}
40
51
52+
41 {% if page.extra.completed %}
53 {% if page.extra.completed %}
42 <span class="db mb1">Completed</span>
54 <span class="db mb1">Completed</span>
43 {% elif page.extra.assignee %}
55 {% elif page.extra.assignee %}
@@ -48,10 +60,6 @@
48 </a>
60 </a>
49 {% endif %}
61 {% endif %}
50
62
51− {% if page.extra.reward %}
52− <span class="db mb1">Reward: {{ page.extra.reward }} Stars</span>
53− {% endif %}
54−
55 {% if page.date %}
63 {% if page.date %}
56 <time class="mono db mv1 gray2 f5">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
64 <time class="mono db mv1 gray2 f5">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
57 {% endif %}
65 {% endif %}