on master help sign in
Merge branch 'grants' into ed/normcore-hero
commit16bed64853f5530f0a68b97aedbcf7d4013ef49c authorMatilde Park <matilde@tlon.io> dateThu 27 May 2021, 11:06 (5 years ago) parentc5b3a9c4147d6a
141 files changed+7295−290
config.toml+5 content/blog/gifts-q3-2020.md+2 content/blog/urbit-grants-and-mid-2019-gifts.md+2 content/getting-started/_index.md+35−165 content/getting-started/cli.md+208 content/getting-started/planet.md+3−3 content/grants/-smol-future-sustained-knowledge-sharing-and-marketing.md+92 content/grants/_index.md+7 content/grants/a-book-about-urbit.md+85 content/grants/a-collaborative-web-mapping-system-for-urbit.md+99 content/grants/analytics-script.md+53 content/grants/antechamber.md+104 content/grants/apprenticeships/_index.md+4 content/grants/art-by-urbit.md+32 content/grants/bart-train-tracker-landscape-tile.md+50 content/grants/bitcoin-full-node-provider-and-wallet.md+92 content/grants/bitcoin-key-derivation.md+61 content/grants/bitcoin-node-json-rpc-api-part-1.md+48 content/grants/bitcoin-node-json-rpc-api-part-2.md+48 content/grants/bitcoin-node-json-rpc-api-part-3.md+49 content/grants/bitcoin-node-json-rpc-api-part-4.md+48 content/grants/bitcoin-wallet-on-bridge.md+59 content/grants/boston-t-train-tracker-landscape-tile.md+55 content/grants/bounties/_index.md+4 content/grants/calendar-ui.md+53 content/grants/calendar.md+115 content/grants/comprehensive-local-server-and-mum-explanation-video.md+41 content/grants/content-saver.md+45 content/grants/cross-platform-desktop-urbit-app.md+85 content/grants/cta-train-tracker-landscape-tile.md+50 content/grants/display-eth-data.md+56 content/grants/docker-image-for-cloud-container-orchestration.md+46 content/grants/educational-guide-todomvc-urbit-edition.md+331 content/grants/escape.md+46 content/grants/ethereum-abi-parser.md+55 content/grants/gall-api-documentation.md+54 content/grants/gifts/_index.md+4 content/grants/go-airlock-library.md+45 content/grants/graph-store-documentation-guide.md+100 content/grants/haskell-airlock-library.md+45 content/grants/hoon-001-learner-efficiency-and-early-learner-resources.md+81 content/grants/host-three-college-university-urbit-meetups-1.md+60 content/grants/host-three-college-university-urbit-meetups-2.md+60 content/grants/host-three-college-university-urbit-meetups-3.md+59 content/grants/host-three-virtual-urbit-meetups.md+51 content/grants/host-two-urbit-meetups-1.md+55 content/grants/host-two-urbit-meetups-10.md+55 content/grants/host-two-urbit-meetups-11.md+55 content/grants/host-two-urbit-meetups-2.md+55 content/grants/host-two-urbit-meetups-3.md+55 content/grants/host-two-urbit-meetups-4.md+55 content/grants/host-two-urbit-meetups-5.md+55 content/grants/host-two-urbit-meetups-6.md+55 content/grants/host-two-urbit-meetups-7.md+55 content/grants/host-two-urbit-meetups-8.md+55 content/grants/host-two-urbit-meetups-9.md+55 content/grants/links-in-urbit-reference-docs.md+30 content/grants/llelogram.md+56 content/grants/matrices-in-hoon.md+57 content/grants/matrixriotim-bridge-bot.md+39 content/grants/minimal-urbit-os.md+56 content/grants/network-explorer-data-pipeline-http-api.md+229 content/grants/open-street-maps-data-importation.md+53 content/grants/overhaul-the-urbitorg-website.md+73 content/grants/proposals/_index.md+4 content/grants/ragnarok-online-on-urbit.md+54 content/grants/search-in-groups.md+41 content/grants/staff-the-urbit-help-desk-1.md+61 content/grants/staff-the-urbit-help-desk-2.md+61 content/grants/staff-the-urbit-helpdesk-east.md+60 content/grants/staff-the-urbit-helpdesk-west.md+57 content/grants/the-complete-guide-to-gall-and-landscape.md+77 content/grants/thread-documentation.md+75 content/grants/tor-nodes-relay-search-tile.md+47 content/grants/translate-key-parts-of-urbitorg-into-german.md+30 content/grants/translate-key-parts-of-urbitorg-into-korean.md+31 content/grants/translate-key-parts-of-urbitorg-into-norwegian.md+32 content/grants/translate-key-parts-of-urbitorg-into-spanish.md+30 content/grants/try-urbit-website.md+32 content/grants/typescript-airlock-library.md+44 content/grants/ua-collaborative-text-editor.md+27 content/grants/ua-filesharer.md+26 content/grants/ua-heads-up-poker.md+30 content/grants/ua-invoice-system.md+30 content/grants/ua-marketplace.md+34 content/grants/ucal-google-and-outlook-integration.md+84 content/grants/udon-syntax-highlighter.md+43 content/grants/unit-tests-for-json-parsing.md+49 content/grants/unit-tests-for-pure-algorithms.md+61 content/grants/unit-tests-for-sha-functions.md+50 content/grants/unit-tests-for-zuse-cryptographic-functions.md+52 content/grants/up-to-date-hoon-reference-card.md+30 content/grants/urbian-a-customized-linux-distribution-for-urbit-appliances.md+86 content/grants/urbit-api-for-elixir.md+38 content/grants/urbit-community-concierge-east-coast-2q2021.md+35 content/grants/urbit-community-concierge-east-coast.md+34 content/grants/urbit-community-concierge-west-coast-2q2021.md+35 content/grants/urbit-community-concierge-west-coast.md+34 content/grants/urbit-event-series.md+90 content/grants/urbit-explainer-video.md+34 content/grants/urbit-http-api-for-emacs-elisp.md+38 content/grants/urbit-http-api-for-kotlin.md+37 content/grants/urbit-http-api-for-rust.md+56 content/grants/urbit-http-interface-java-edition.md+69 content/grants/urbit-http-library-for-ruby.md+39 content/grants/urbit-lfs-filehosting.md+68 content/grants/urbit-online-meetup.md+30 content/grants/urbit-react-cookbook.md+46 content/grants/urbit-ship-and-star-hosting-and-troubleshooting-docs.md+38 content/grants/verifying-urbit-id-on-keybase.md+75 content/grants/video-content-manager.md+59 content/grants/volt-lightning-on-urbit.md+232 content/grants/web-scraper.md+45 content/grants/webrtc-gall-agent-and-external-app.md+77 content/reset.md+2−2 content/understanding-urbit/interface.md+10−10 content/updates/2018-2-17-update.md+2 content/using/id/guide-to-breaches.md+2−2 content/using/os/ship-troubleshooting.md+1−1 sass/_main.scss+11−8 sass/_responsive.scss+12−2 static/detect.js+26 static/scripts.js+14−10 templates/base.html+3−3 templates/grant_category/list.html+1 templates/grant_category/single.html+36 templates/grant_type/apprenticeships.html+81 templates/grant_type/bounties.html+47 templates/grant_type/gifts.html+56 templates/grant_type/list.html+1 templates/grant_type/proposals.html+90 templates/grant_type/single.html+23 templates/grants/grant.html+71 templates/grants/list.html+98 templates/index.html+100−81 templates/macros/macros.html+55−1 templates/page_indiced.html+2−2 templates/post_type/list.html+1 templates/post_type/single.html+1 templates/taxonomy/list.html+33 templates/taxonomy/single.html+44
config.toml+5
@@ -11,6 +11,11 @@ compile_sass = true
1111# Whether to generate a RSS feed automatically
1212generate_feed = true
1313build_search_index = true
14+taxonomies = [
15+ { name = "grant_type" },
16+ { name = "grant_category" },
17+ { name = "post_type" }
18+]
1419feed_filename = "rss.xml"
1520
1621[markdown]
content/blog/gifts-q3-2020.md+2
@@ -2,6 +2,8 @@
22title = "Gifts Q3 2020"
33date = 2020-09-23
44description = "Twice a year we distribute address space to those that have made valuable contributions to Urbit. Now called our Gifts program, the gifting of address space has been part of Urbit long before we had a grants program."
5+[taxonomies]
6+post_type = ["gifts"]
57[extra]
68author = "Josh Lehman"
79ship = "~wolref-podlex"
content/blog/urbit-grants-and-mid-2019-gifts.md+2
@@ -3,6 +3,8 @@ title = "Urbit Grants and mid-2019 Gifts"
33date = 2019-06-10
44description = "Announcing an upcoming Urbit grants program and star gifts for Mid-2019."
55aliases = ["/posts/essays/urbit-grants-and-mid-2019-gifts", "/posts/urbit-grants-and-mid-2019-gifts"]
6+[taxonomies]
7+post_type = ["gifts"]
68[extra]
79author = "Galen Wolfe-Pauly + Alex Matzner"
810ship = "~ravmel-ropdyl + ~mignyt-mogseb"
content/getting-started/_index.md+35−165
@@ -6,209 +6,79 @@ page_template = "page_indiced.html"
66template = "getting-started/index.html"
77+++
88
9−The price of using other platforms is your data and its security. There's a reason they're free to use.
9+If you use Mac or Linux and just want to jump in, you can download **Port** and install it to run Urbit for you and get going right away. You can also set up Urbit using the command line.
1010
11−The price of using Urbit is your own responsibility — you must run it yourself (or pay someone to run it for you).
11+If you run Windows, or just want to give it a shot without worrying about the gritty bits, you may want to consider a [hosting provider](@/getting-started/planet.md#hosting-providers), though Windows instructions are provided [for power users](@/getting-started/cli.md).
1212
13−It's easy and it keeps getting easier.
13+### Get Port {#port}
1414
15−There are currently two ways to run Urbit:
15+**Port** is a desktop GUI application that allows you to spin up, access, and manage your Urbit ships without any knowledge of the command line or Urbit binary.
1616
17−If you use Mac or Linux and are not afraid of a few terminal commands, we recommend you run it yourself. That is the aim of this guide.
18−
19−If you run Windows or just want to give it a shot without worrying about the gritty bits, you may want to consider a [hosting provider](@/getting-started/planet.md#hosting-providers).
20−
21−## Installing Urbit {#macos-and-linux}
22−
23−Choose the code for your operating system and run the commands in your terminal.
24−
25−<div id="os">
26− <input type="radio" id="macos" name="os" checked>
27− <label for="macos">MacOS</label>
17+<div id="port-os" class="os mv3">
18+ <input type="radio" id="port-macos" name="port-os" checked>
19+ <label for="port-macos">MacOS</label>
2820 <div class="tab">
29−
30−```sh
31−mkdir ~/urbit
32−cd ~/urbit
33−curl -JLO https://urbit.org/install/mac/latest
34−tar zxvf ./darwin.tgz --strip=1
35−~/urbit/urbit
36−```
21+ <p>To install <strong>Port</strong> on MacOS simply download and open the <code>.dmg</code> file.</p>
22+ <a href="https://github.com/arthyn/taisho/releases/latest/download/taisho.dmg" class="dib ph3 ba b--gray3 br2">
23+ Download Port
24+ <svg class="dib ml1" viewBox="0 0 842 1000" width="13.5" height="14" xmlns="http://www.w3.org/2000/svg"><path fill="#000000" d="M702 960c-54.2 52.6-114 44.4-171 19.6-60.6-25.3-116-26.9-180 0-79.7 34.4-122 24.4-170-19.6-271-279-231-704 77-720 74.7 4 127 41.3 171 44.4 65.4-13.3 128-51.4 198-46.4 84.1 6.8 147 40 189 99.7-173 104-132 332 26.9 396-31.8 83.5-72.6 166-141 227zM423 237C414.9 113 515.4 11 631 1c15.9 143-130 250-208 236z"/></svg>
25+ </a>
3726 </div>
3827
39− <input type="radio" id="linux" name="os">
40− <label for="linux">Linux</label>
28+ <input type="radio" id="port-linux" name="port-os">
29+ <label for="port-linux">Linux</label>
4130 <div class="tab">
4231
43−```sh
44−mkdir ~/urbit
45−cd ~/urbit
46−wget --content-disposition https://urbit.org/install/linux64/latest
47−tar zxvf ./linux64.tgz --strip=1
48−~/urbit/urbit
49−```
50−
51−Linux users may need to run this command in another terminal window to access your Urbit on port 80:
32+We use `snap` so that **Port** can stay updated automatically. If you already have `snap` installed, simply run:
5233
5334```sh
54−sudo apt-get install libcap2-bin
55−sudo setcap 'cap_net_bind_service=+ep' ~/urbit/urbit
35+sudo snap install port
5636```
57−</div>
58−
59− <input type="radio" id="windows" name="os">
60− <label for="windows">Windows</label>
61− <div class="tab">
6237
63−> Please note that this method of installing Urbit is experimental, and we may not be able to assist you if you encounter issues related to WSL 2.
38+Or to install `snap` for your distribution, snapcraft provides [installation instructions](https://snapcraft.io/docs/installing-snapd).
6439
65−Urbit cannot run on Windows itself, but there is a convenient way to run Linux using the [Windows Subsystem for Linux 2](https://docs.microsoft.com/en-us/windows/wsl/wsl2-install) on Windows 10. Install the Windows Subsystem for Linux 2 and open a Linux terminal in Windows, then follow the Linux installation instructions below. These instructions have been tested and verified for WSL 2 + Ubuntu 18.04 LTS, as demonstrated in `~sitful-hatred`'s step-by-step setup guide [here](https://subject.network/posts/urbit-wsl2/).
66−
67−For performance reasons, do not install Urbit in the mounted Windows volume, but install it in the Linux file system. For example, in your home directory, which can be navigated to by entering `cd ~`.
68−</div>
40+ </div>
6941</div>
7042
7143<style>
72− #os {
44+ .os {
7345 display: flex;
7446 flex-wrap: wrap;
7547 }
76− #os label {
48+ .os label {
7749 order: -1;
7850 padding: .5rem;
51+ min-width: 70px;
52+ text-align: center;
7953 border-width: 1px 0px 0px 1px;
8054 border-style: solid;
8155 cursor: pointer;
8256 }
83− #os label[for=windows] {
57+ .os label:last-of-type {
8458 border-right-width: 1px;
8559 }
86− #os input[type="radio"] {
60+ .os input[type="radio"] {
8761 display: none;
8862 }
89− #os .tab {
63+ .os .tab {
9064 display: none;
9165 border: 1px solid;
9266 padding: 1rem;
67+ width: 100%;
9368 max-width: 100%;
9469 }
95− #os input[type='radio']:checked + label {
70+ .os .tab p:first-child {
71+ margin-top: 0;
72+ }
73+ .os .tab p:last-child {
74+ margin-bottom: 0;
75+ }
76+ .os input[type='radio']:checked + label {
9677 font-weight: bold;
9778 }
98− #os input[type='radio']:checked + label + .tab {
79+ .os input[type='radio']:checked + label + .tab {
9980 display: block;
10081}
10182</style>
10283
103−If successful, you will see a block of output beginning with the line:
104−
105−```
106−Urbit: a personal server operating function
107−```
108−
109−## Booting a Free Identity {#comet}
110−
111−There are two parts to Urbit: an **ID** and an **Operating System**.
112−
113−You have just installed the Operating System on your computer.
114−
115−The **ID** is similar to a username and password on another site. The difference is that the public part (the username) is verified by thousands of people around the world while only you hold the key (the password) to that ID.
116−
117−There are five kinds of Urbit IDs but to get started you only need to know about two: we call them **planets** and **comets**.
118−
119−***
120−
121−**Planets** are scarce (this prevents spamming, among other things) and usually require a price to acquire. This is the recommended way to run Urbit, but it's a bit more involved.
122−
123−A planet name looks like `~sampel-palnet`.
124−
125−[Follow this guide](@/getting-started/planet.md) if you have already acquired a planet.
126−
127−[Find a planet to purchase](@/getting-started/planet.md#purchase)
128−
129−***
130−
131−**Comets** are practically unlimited and free to acquire. At present, these are a great way to try out the network for free.
132−
133−A comet name looks like `~dasres-ragnep-lislyt-ribpyl--mosnyx-bisdem-nidful-marzod`.
134−
135−[Read more about Urbit ID here](/understanding-urbit/urbit-id)
136−
137−
138−***
139−
140−To boot a comet, go into the command line and run the following command from the `urbit` directory you created during [Urbit installation](#installing-urbit):
141−
142−```sh
143−~/urbit/urbit -c mycomet
144−```
145−
146−It may take a while to load the comet (probably only take a few minutes, but it could take longer). This comes along with it being free. When it's done you'll some messages ending like this:
147−
148−```
149−ames: on localhost, UDP 31337.
150−http: live (insecure, public) on 8080
151−http: live ("secure", public) on 8443
152−http: live (insecure, loopback) on 12321
153−~sampel_marzod:dojo>
154−```
155−
156−When your comet is finished booting, you will see `~sampel_marzod:dojo>` (Dojo: the Urbit command line).
157−
158−To exit Urbit, use `Ctrl-D` or enter `|exit` into Dojo.
159−
160−To start your comet up again, run the following from your `urbit` directory (note the lack of `-c` argument):
161−
162−```sh
163−~/urbit/urbit mycomet
164−```
165−
166−## Using Landscape
167−
168−Urbit is an entirely new computer, so by default it drops you into the "dojo," which is its terminal. Like your current computer, it can be used to do just about anything if you know the right commands. You only need to know one command for now.
169−
170−At the moment, the most common way to use Urbit is through a web app named [Landscape](@/docs/glossary/landscape.md), which comes with Urbit. It runs in your browser and provides an interface to Urbit without using the terminal. You need to get the password, or `code`.
171−
172−1. With your Urbit running, look for a line that says something like `http: live (insecure, public) on 80`. The number given is the port that your ship is using. It will probably be 80, but we're just making sure. (Don't worry about the "insecure, public" part — that just means you can access it from your own web browser. It doesn't give anyone else access.)
173−2. If the port given is `80`, simply type `localhost` into your browser's address bar. If the given port is a different number, such as `8080`, you would type `localhost:8080`. You'll be met with a login prompt.
174−3. In the window where you found the port number, type `+code` and press return. Copy-paste the code that appears into the "Access Key" field in the browser, and press continue.
175−4. Once in, take a look around and read the instructions on screen. If you ever get logged out, follow these instructions again.
176−
177−## Next Steps
178−
179−### Updating your comet {#updating}
180−
181−The Urbit application comes with a recent release of the Urbit OS, but automatic updates ("over the air") can be enabled so new binaries aren't necessary for each update. Planets have automatic updates enabled by default, but this is not the case for comets. Many comets are used only once and thrown away, so it would be wasteful to update every single comet as soon as it boots. If you plan to use your comet for more than a quick test, you'll probably want to ensure you're running the latest version of the OS.
182−
183−You can enable updates for your comet by typing `|ota (sein:title our now our) %kids` into Dojo and pressing Enter.
184−
185−```
186−> |ota (sein:title our now our) %kids
187−>=
188−```
189−
190−If you want to make sure you'll get updates, you can check by typing `|ota` with no arguments:
191−
192−```
193−~sampel_marzod:dojo> |ota
194−OTAs enabled from %kids on ~marzod
195−use |ota %disable or |ota ~sponsor %kids to reset it
196−> |ota
197−>=
198−```
199−
200−### Read More about the Dojo {#the-dojo}
201−
202−The dojo is Urbit's command line. You can use it to control your ship, or to execute arbitrary code. Check out the links below for more information.
203−
204−- [Basic Operations](@/using/os/getting-started.md)
205−- [Basic Hoon](/docs/tutorials/hoon/hoon-school/setup)
206−- [Glossary Entry](/docs/glossary/dojo)
207−
208−### Purchase a Permanent Identity {#boot-your-planet}
209−
210−You can continue using this comet indefinitely. There are currently few differences between using a comet-level identity and a planet-level one. However, some groups will not allow comets entry in order to maintain a certain level of quality, and changes may be made in the future that further devalue comets. They will always, however, be able to access the basic functions of the network.
211−
212−A comet also comes with a long and fairly unmemorable name whereas a planet has a short name and a "sigil" (avatar) associated with it that makes it more identifiable on the network. You may notice all this within the first few minutes of using Urbit.
213−
214−[To read instructions on how to purchase and use a planet, visit this page](@/getting-started/planet.md).
84+If you'd like to have more direct control over the Urbit virtual machine, or are setting up Urbit on a cloud droplet, try [installation using the command line](@/getting-started/cli.md).
content/getting-started/cli.mdnew file+208
@@ -0,0 +1,208 @@
1++++
2+title = "Installing Urbit using the command line"
3+weight = 2
4+description = "Installation instructions for power users."
5++++
6+
7+If you're a power user, you can run the Urbit virtual machine directly using the command line. Choose the code for your operating system and run the commands in your terminal.
8+
9+<div id="os" class="os">
10+ <input type="radio" id="macos" name="os" checked>
11+ <label for="macos">MacOS</label>
12+ <div class="tab">
13+
14+```sh
15+mkdir ~/urbit
16+cd ~/urbit
17+curl -JLO https://urbit.org/install/mac/latest
18+tar zxvf ./darwin.tgz --strip=1
19+~/urbit/urbit
20+```
21+ </div>
22+
23+ <input type="radio" id="linux" name="os">
24+ <label for="linux">Linux</label>
25+ <div class="tab">
26+
27+```sh
28+mkdir ~/urbit
29+cd ~/urbit
30+wget --content-disposition https://urbit.org/install/linux64/latest
31+tar zxvf ./linux64.tgz --strip=1
32+~/urbit/urbit
33+```
34+
35+Linux users may need to run this command in another terminal window to access your Urbit on port 80:
36+
37+```sh
38+sudo apt-get install libcap2-bin
39+sudo setcap 'cap_net_bind_service=+ep' ~/urbit/urbit
40+```
41+</div>
42+
43+ <input type="radio" id="windows" name="os">
44+ <label for="windows">Windows</label>
45+ <div class="tab">
46+
47+> Please note that this method of installing Urbit is experimental, and we may not be able to assist you if you encounter issues related to WSL 2.
48+
49+Urbit cannot run on Windows itself, but there is a convenient way to run Linux using the [Windows Subsystem for Linux 2](https://docs.microsoft.com/en-us/windows/wsl/wsl2-install) on Windows 10. Install the Windows Subsystem for Linux 2 and open a Linux terminal in Windows, then follow the Linux installation instructions below. These instructions have been tested and verified for WSL 2 + Ubuntu 18.04 LTS, as demonstrated in `~sitful-hatred`'s step-by-step setup guide [here](https://subject.network/posts/urbit-wsl2/).
50+
51+For performance reasons, do not install Urbit in the mounted Windows volume, but install it in the Linux file system. For example, in your home directory, which can be navigated to by entering `cd ~`.
52+</div>
53+</div>
54+
55+If successful, you will see a block of output beginning with the line:
56+
57+```
58+Urbit: a personal server operating function
59+```
60+
61+### Booting a free identity {#comet}
62+
63+There are two parts to Urbit: an **ID** and an **Operating System**.
64+
65+You have just installed the Operating System on your computer.
66+
67+The **ID** is similar to a username and password on another site. The difference is that the public part (the username) is verified by thousands of people around the world while only you hold the key (the password) to that ID.
68+
69+There are five kinds of Urbit IDs but to get started you only need to know about two: we call them **planets** and **comets**.
70+
71+***
72+
73+**Planets** are scarce (this prevents spamming, among other things) and usually require a price to acquire. This is the recommended way to run Urbit, but it's a bit more involved.
74+
75+A planet name looks like `~sampel-palnet`.
76+
77+[Follow this guide](@/getting-started/planet.md) if you have already acquired a planet.
78+
79+[Find a planet to purchase](@/getting-started/planet.md#purchase)
80+
81+***
82+
83+**Comets** are practically unlimited and free to acquire. At present, these are a great way to try out the network for free.
84+
85+A comet name looks like `~dasres-ragnep-lislyt-ribpyl--mosnyx-bisdem-nidful-marzod`.
86+
87+[Read more about Urbit ID here](/understanding-urbit/urbit-id)
88+
89+
90+***
91+
92+To boot a comet, go into the command line and run the following command from the `urbit` directory you created during [Urbit installation](#installing-urbit):
93+
94+```sh
95+~/urbit/urbit -c mycomet
96+```
97+
98+It may take a while to load the comet (probably only take a few minutes, but it could take longer). This comes along with it being free. When it's done you'll some messages ending like this:
99+
100+```
101+ames: on localhost, UDP 31337.
102+http: live (insecure, public) on 8080
103+http: live ("secure", public) on 8443
104+http: live (insecure, loopback) on 12321
105+~sampel_marzod:dojo>
106+```
107+
108+When your comet is finished booting, you will see `~sampel_marzod:dojo>` (Dojo: the Urbit command line).
109+
110+To exit Urbit, use `Ctrl-D` or enter `|exit` into Dojo.
111+
112+To start your comet up again, run the following from your `urbit` directory (note the lack of `-c` argument):
113+
114+```sh
115+~/urbit/urbit mycomet
116+```
117+
118+### Using Landscape
119+
120+Urbit is an entirely new computer, so by default it drops you into the "dojo," which is its terminal. Like your current computer, it can be used to do just about anything if you know the right commands. You only need to know one command for now.
121+
122+At the moment, the most common way to use Urbit is through a web app named [Landscape](@/docs/glossary/landscape.md), which comes with Urbit. It runs in your browser and provides an interface to Urbit without using the terminal. You need to get the password, or `code`.
123+
124+1. With your Urbit running, look for a line that says something like `http: live (insecure, public) on 80`. The number given is the port that your ship is using. It will probably be 80, but we're just making sure. (Don't worry about the "insecure, public" part — that just means you can access it from your own web browser. It doesn't give anyone else access.)
125+2. If the port given is `80`, simply type `localhost` into your browser's address bar. If the given port is a different number, such as `8080`, you would type `localhost:8080`. You'll be met with a login prompt.
126+3. In the window where you found the port number, type `+code` and press return. Copy-paste the code that appears into the "Access Key" field in the browser, and press continue.
127+4. Once in, take a look around and read the instructions on screen. If you ever get logged out, follow these instructions again.
128+
129+## Next Steps
130+
131+### Updating your comet {#updating}
132+
133+The Urbit application comes with a recent release of the Urbit OS, but automatic updates ("over the air") can be enabled so new binaries aren't necessary for each update. Planets have automatic updates enabled by default, but this is not the case for comets. Many comets are used only once and thrown away, so it would be wasteful to update every single comet as soon as it boots. If you plan to use your comet for more than a quick test, you'll probably want to ensure you're running the latest version of the OS.
134+
135+You can enable updates for your comet by typing `|ota (sein:title our now our) %kids` into Dojo and pressing Enter.
136+
137+```
138+> |ota (sein:title our now our) %kids
139+>=
140+```
141+
142+If you want to make sure you'll get updates, you can check by typing `|ota` with no arguments:
143+
144+```
145+~sampel_marzod:dojo> |ota
146+OTAs enabled from %kids on ~marzod
147+use |ota %disable or |ota ~sponsor %kids to reset it
148+> |ota
149+>=
150+```
151+
152+### Read More about the Dojo {#the-dojo}
153+
154+The dojo is Urbit's command line. You can use it to control your ship, or to execute arbitrary code. Check out the links below for more information.
155+
156+- [Basic Operations](@/using/os/getting-started.md)
157+- [Basic Hoon](/docs/tutorials/hoon/hoon-school/setup)
158+- [Glossary Entry](/docs/glossary/dojo)
159+
160+### Purchase a Permanent Identity {#boot-your-planet}
161+
162+You can continue using this comet indefinitely. There are currently few differences between using a comet-level identity and a planet-level one. However, some groups will not allow comets entry in order to maintain a certain level of quality, and changes may be made in the future that further devalue comets. They will always, however, be able to access the basic functions of the network.
163+
164+A comet also comes with a long and fairly unmemorable name whereas a planet has a short name and a "sigil" (avatar) associated with it that makes it more identifiable on the network. You may notice all this within the first few minutes of using Urbit.
165+
166+[To read instructions on how to purchase and use a planet, visit this page](@/getting-started/planet.md).
167+
168+
169+<style>
170+ .os {
171+ display: flex;
172+ flex-wrap: wrap;
173+ }
174+ .os label {
175+ order: -1;
176+ padding: .5rem;
177+ min-width: 70px;
178+ text-align: center;
179+ border-width: 1px 0px 0px 1px;
180+ border-style: solid;
181+ cursor: pointer;
182+ }
183+ .os label:last-of-type {
184+ border-right-width: 1px;
185+ }
186+ .os input[type="radio"] {
187+ display: none;
188+ }
189+ .os .tab {
190+ display: none;
191+ border: 1px solid;
192+ padding: 1rem;
193+ width: 100%;
194+ max-width: 100%;
195+ }
196+ .os .tab p:first-child {
197+ margin-top: 0;
198+ }
199+ .os .tab p:last-child {
200+ margin-bottom: 0;
201+ }
202+ .os input[type='radio']:checked + label {
203+ font-weight: bold;
204+ }
205+ .os input[type='radio']:checked + label + .tab {
206+ display: block;
207+}
208+</style>
content/getting-started/planet.md+3−3
@@ -1,5 +1,5 @@
11+++
2−title = "Setting up Your Planet"
2+title = "Setting up your planet"
33weight = 1
44description = "Getting started with a permanent Urbit identity."
55+++
@@ -60,13 +60,13 @@ and copy the key inside. Paste it into the following command, except with
6060the name of your planet. **Do not include the tilde in your planet name.**
6161
6262```sh
63−./urbit -p ames_port -w sampel-palnet -G rAnDoMkEy
63+./urbit -p ames_port -w sampel-palnet -G rAnDoMkEy
6464```
6565
6666Or you can copy the keyfile into the current directory and run:
6767
6868```sh
69−./urbit -p ames_port -w sampel-palnet -k ./my-planet.key
69+./urbit -p ames_port -w sampel-palnet -k ./my-planet.key
7070```
7171
7272Either command will create a directory called `sampel-palnet/` and begin booting your planet. It may take a few minutes.
content/grants/-smol-future-sustained-knowledge-sharing-and-marketing.mdnew file+92
@@ -0,0 +1,92 @@
1++++
2+title = "-=[smol future]=- Sustained Knowledge Sharing and Marketing"
3+date = 2021-01-15
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Create sustained documentation and marketing efforts that will support and encourage new users to run Urbit on their own RPi devices."
10+reward = 10
11+assignee = "~naltyc-wornes (dasfeb.industries)"
12+id = "1395578140"
13+completed = false
14+link = ""
15++++
16+
17+[![smol vibe](https://i.gyazo.com/1307af94079e4ab07880a29b9b0ef2fa.png)](https://i.gyazo.com/1307af94079e4ab07880a29b9b0ef2fa.png)
18+*“If you want to build a ship, don’t drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea.”  -Antoine de Saint-Exupéry*
19+
20+## Why
21+The core philosophy behind Urbit software is freedom and personal sovereignty in the digital age. Your data, your computation, your identity. This narrative presents a powerful marketing opportunity, as it immediately resonates with modern-day people striving against megacorp data silos, centralized censorship and behavioral data harvesting.
22+
23+But we're only halfway there. To complete the circle, we must also encourage and support the use of *hardware* that allows Urbit to run on personally owned and inexpensive small computing devices. And we need to spread this empowering narrative across the globe.
24+
25+## How
26+Selling productized Urbit hardware devices is one effort to help complete the circle. This will eventually be achievable via customized software development ([see ~botter's Urbian project](https://grants.urbit.org/proposals/337545546)).
27+
28+The other critical area of work is **Sustained Knowledge Sharing and Marketing**. We need updated documentation that helps people set up and manage their own Urbit hardware devices. And we need ongoing marketing outreach to excite and engage broader communities of people where Urbit's philosophy can be introduced, take root, and grow.
29+
30+## What
31+-=[smol future]=- is a project to create sustained documentation and marketing efforts that will support and encourage new users to run Urbit on their own small computing devices. We will focus on Raspberry Pi to leverage its vibrant ecosystem of users, developers and integrators.
32+
33+## Who
34+I joined Urbit in February 2020. Since then, I've cultivated the --=[ smol computers ]=-- group into an active community of ~500 members. I run two stars (~dasfeb and ~dalten) on production-quality small computing devices like Raspberry Pi and NanoPi, and I continually test new hardware configurations while documenting best practices to help others. I am prolific and adept at designing creative marketing content as well as community outreach on Twitter and other social media platforms. My personal and professional credentials are [publicly available](https://johnlester.me).
35+
36+Let's do this and change the world.
37+
38+[![smol vibe](https://i.gyazo.com/2346666e5b40623353fee1dca42f9879.jpg)](https://i.gyazo.com/2346666e5b40623353fee1dca42f9879.jpg)
39+
40+## Milestones
41+
42+
43+### Initial Documentation: Beginner's Guide
44+1 stars
45+Publish a comprehensive guide on urbit.org wiki explaining how to run Urbit on a Raspberry Pi using recommended and tested hardware configurations. Walk the user through every step of of the process.
46+
47+
48+### Initial Marketing: Outreach + Messaging
49+1 stars
50+Research and outreach to engage existing Raspberry Pi users and key hardware manufacturers. Introduce the Urbit narrative into new communities, including memes/vibes.
51+
52+
53+### Sustained Documentation + Marketing: MAR
54+1 stars
55+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
56+
57+
58+### Sustained Documentation + Marketing: APR
59+1 stars
60+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
61+
62+
63+### Sustained Documentation+Marketing: MAY
64+1 stars
65+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
66+
67+
68+### Sustained Documentation + Marketing: JUN
69+1 stars
70+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
71+
72+
73+### Sustained Documentation + Marketing: JUL
74+1 stars
75+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
76+
77+
78+### Sustained Documentation + Marketing: AUG
79+1 stars
80+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
81+
82+
83+### Sustained Documentation + Marketing: SEP
84+1 stars
85+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
86+
87+
88+### Sustained Documentation + Marketing: OCT
89+1 stars
90+A fire-and-forget approach will fail. To succeed and continually gain traction, both documentation (updated content) and marketing (new outreach/engagement/materials) must be sustained efforts.
91+
92+
content/grants/_index.mdnew file+7
@@ -0,0 +1,7 @@
1++++
2+title = "Grants"
3+sort_by = "date"
4+template = "grants/list.html"
5+page_template = "grants/grant.html"
6+aliases = ["/community/grants"]
7++++
content/grants/a-book-about-urbit.mdnew file+85
@@ -0,0 +1,85 @@
1++++
2+title = "A book about Urbit"
3+date = 2020-07-23
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "A short book about Urbit, on Urbit, including Urbit-centric sections about the wider world of computing"
10+reward = 12
11+assignee = "librex-dozryc"
12+id = "1590647060"
13+completed = false
14+link = ""
15++++
16+
17+I'm writing a book-length history of Urbit. I'll also write, in an Urbit-centric way, about the the wider world of computing. Chapters will be posted on Urbit, beginning October 21st, in the Notebooks section of the group ~librex-dozryc/AUC . Right now I see the piece as going something like this:
18+
19+1. Preface. A short story about the year 2050. Introduction to the concept of Urbit.
20+2. Laundry list of the things wrong with the current internet, only more dramatic than a laundry list
21+3. Laundry list of the things wrong with the current internet, only more dramatic than a laundry list, continued.
22+4. Social history of computers
23+5. Social history of computers, continued
24+6. Technical explanation of Urbit, only more dramatic than a technical explanation
25+7. Technical explanation of Urbit, only more dramatic than a technical explanation, continued
26+8. Social history of Urbit
27+9. Social history of Urbit, continued
28+10. Summing up
29+
30+I'm a novelist and essayist who has written about tech, politics, and literature. My plan, so far, for any received stars, is to spawn planets for interesting individuals and communities who might like Urbit, and to research what might go into creating a hosted star-based community.
31+
32+
33+## Milestones
34+
35+
36+### First Chapter
37+1 stars
38+Ch1. Actually completed 10/21, not 10/29
39+
40+
41+### Second Chapter
42+1 stars
43+Ch2
44+
45+
46+### Third Chapter
47+1 stars
48+Ch3
49+
50+
51+### Fourth Chapter
52+1 stars
53+Ch4
54+
55+
56+### Fifth Chapter
57+1 stars
58+Ch5
59+
60+
61+### Sixth Chapter
62+1 stars
63+Ch6
64+
65+
66+### Seventh Chapter
67+1 stars
68+Ch7
69+
70+
71+### Eighth Chapter
72+1 stars
73+Ch8
74+
75+
76+### Ninth Chapter
77+1 stars
78+Ch9
79+
80+
81+### Tenth Chapter
82+3 stars
83+Ch10. Contract is for disbursal of 12 stars at 1 star per chapter until completion; if projected is completed in fewer than 12 chapters, then remaining stars (12 - x) are to be disbursed at completion
84+
85+
content/grants/a-collaborative-web-mapping-system-for-urbit.mdnew file+99
@@ -0,0 +1,99 @@
1++++
2+title = "A Collaborative Web Mapping System for Urbit"
3+date = 2020-09-03
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Allow small scale spatial data to be stored and retrieved in Urbit, for use in landscape and external applications, and shared across ships."
10+reward = 4
11+assignee = "Lumphead"
12+id = "634393623"
13+completed = false
14+link = ""
15++++
16+
17+A Collaborative Web Mapping System for Urbit
18+==================
19+
20+##### Goal
21+
22+
23+Allow small scale spatial data to be stored and retrieved in Urbit, for use in landscape and external applications, and shared across ships.
24+
25+##### Background/Motivation
26+
27+
28+This proposal has grown out of a previous bounty which called for Open Street Map data to be ingested into Urbit. Through discussion it was decided that as OSM already provides a free, open and widely available base map and street network, a more useful system for Urbit would provide a method of storing spatial documents, which can overlay upon existing spatial data such as Open Street Map tiles, be collected together for use in landscape apps, and combined, shared and collaboratively edited with other ships as 'Portals'. A spatial document, for the purpose of this proposal, is a single valid GeoJSON[^1] document. A spatial document could contain a single geometry, a feature (geometry with associated properties), or a collection of features (a GeoJSON 'featurecollection'). A Portal is a collection of spatial documents, with associated metadata and can include spatial documents from multiple ships, whose owners can collaboratively edit or construct maps.
29+
30+##### Overview
31+
32+
33+ * The proposed system will follow the Urbit store-hook-view pattern as described here https://docs.google.com/document/d/1hS_UuResG1S4j49_H-aSshoTOROKBnGoJAaRgOipf54/edit?ts=5d533e42
34+
35+ * The system will be implemented in two stages. The first stage will implement simple spatial types and a spatial document store, demonstrate input and output of spatial data, and provide a minimal landscape app for creating and editing spatial documents, but limited to the local ship. The second stage will build on the first and provide Portals; collections of spatial documents and associated metadata, which can be shared across ships - similar to the 'canvas' landscape app (https://github.com/yosoyubik/canvas).
36+
37+#### Stage 1 - A spatial store, spatial types, simple demo app
38+
39+
40+##### Spatial Document Store and Tools
41+
42+ * A storage system for the GeoJSON[^1] format and following the GeoJSON feature model.
43+ * The store will accept GeoJSON, validate and store, my intention is to use 'enjs' and/or 'de-json:html' existing hoon libraries to parse JSON. It will not perform any spatial indexing[^2]
44+ * Implement spatial types/structures - geometry, position, point, polygon, linestring, multipoint, multipolygon, geometrycollection upon which can be built the geojson geometry and feature model.
45+ * Implement a generator which can read a GeoJSON document in to the store, and can write a constructed document out of the store.
46+ * Implement a test suite based around GeoJSON specification and the above generator.
47+
48+##### Hook, View and Landscape App
49+
50+ * Implement the hook and view components of store-hook-view pattern atop the spatial data store.
51+ * In this stage the system will only allow data to be viewed/edited on the local ship.
52+ * Integrating spatial information with Landscape apps (which can render vector features using available javascript libraries/clients such as Openlayers and Leaflet).
53+ * Overall, somewhat like 'urlayers' hackathon project (github.com/gusmacaulay/urlayers), but with a sane data store and following the store-hook-view pattern.
54+
55+#### Stage 2 - A Portal Store and Collaboration System
56+
57+##### Store (Metadata, Portals)
58+
59+ * Expands on the Stage 1 architecture with additional store
60+ * The additional store which will house Portals. Portals consists of a map document with metadata (area of interest bounds, styling[^3], author/s etc.), and which may contain many spatial documents, which may be stored locally or on other ships.
61+ * It may be that the Urbit graph store is the appropriate place for this information, exploring using graph store vs a custom Portal store will be undertaken as part of Stage 2.
62+
63+##### Hook/View/App
64+
65+* A hook/view/landscape app which allows for displaying and interacting with Portals;
66+ * Editing of individual Portals
67+ * Sharing of Portals. As a resource owned by a ship, a Portal is somewhat analogous to a chat channel. Individual spatial documents within the Portal can come from local or foreign ship. The owner of the Portal will be able to set permissions on spatial documents within the portal.
68+ * The overall concept of the Portal app can be likened to the 'canvas' landscape app, but for maps and cartography. The key feature is to present a Portal map with spatial data from different ships and collaborative editing.
69+
70+##### Footnotes
71+
72+[^1]: The very readable spec for geojson can be found here http://geojson.org. An overview of GeoJSON summarizing
73+it's advantages and limitations can be found here https://macwright.com/2015/03/23/geojson-second-bite.html
74+
75+[^2]: A mature spatial store would include spatial indexes and provide spatial queries, however for the objectives of this proposal basic spatial spatial documents storage and retrieval can be achieved without spatial indexing. Each spatial document is treated as its own entity, and has limited querying beyond fetching and inspecting the data structure. However this is enough that it can easily be splatted on a map. Spatial indexing of geometries (or parent features/feature collections), is a sensible next step, which would allow many more use cases but is not in scope for this proposal.
76+
77+[^3]: It may be possible to store styling info within the spatial documents, there are at least two GeoJSON style storage conventions, but nothing standardised (see discussion here https://gis.stackexchange.com/questions/22474/geojson-styling-information). Neither of these are part of the GeoJSON standard and appear to be not used much in the wild. There are formats such as KML and GeoPackage which have styling support, but these are also more complex formats.
78+
79+##### About Me
80+
81+I am a beef farmer and software engineer (geospatial web applications). I work with tools/frameworks such as Openlayers, Leaflet, Geoserver, Postgresql/PostGIS etc. and I code predominantly in Java, Javascript, SQL, Clojure, and Python. I have completed the original Hoon 101 course, half the 201 course, and the recent hackathon. My hackathon entry was a very primitive geojson editor gall/landscape app (https://github.com/gusmacaulay/urlayers).
82+
83+
84+~lomped-firser
85+
86+
87+## Milestones
88+
89+
90+### Stage 1
91+2 stars
92+A spatial store, spatial types, simple demo landscape app
93+
94+
95+### Stage 2
96+2 stars
97+A Portal Store and Collaboration System
98+
99+
content/grants/analytics-script.mdnew file+53
@@ -0,0 +1,53 @@
1++++
2+title = "Analytics Script"
3+date = 2021-05-12
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Write a generator that exports chat data into a CSV."
10+reward = 1
11+assignee = ""
12+completed = false
13+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0015&prefill_Grant+Name=Analytics%20Script"
14++++
15+
16+## Overview
17+
18+In order to understand the growth of the network, it's important that we be able to measure the amount of activity within groups at any given point. Your task is to build an open-source script (a [generator](https://urbit.org/docs/tutorials/hoon/hoon-school/generators/)) that exports group activity into a format that can be analyzed.
19+
20+## Implementation
21+
22+The generator will read data from `graph-store` (and other requisite agents) and extract it into a CSV file.
23+
24+### Output
25+
26+The output of the generator is a CSV file with the following format: `timestamp,ship,group,channel,channel-type,content`. Each row of data represents a single post of some type; either a chat message, notebook post, or collection post.
27+
28+The result of running the CSV should output the clay path to the file.
29+
30+### Inputs
31+
32+The generator should accept a few parameters:
33+
34+- `path` (required): path to write the CSV to.
35+- `from` (required): absolute date (`@da`) from which data should be pulled.
36+- `to` (optional): absolute date (`@da`) up until which point data should be pulled. Default is the current time.
37+- `groups` (optional): list of groups to read data from. Default is to pull data from all groups that the running ship is a member of.
38+- `content` (optional): boolean of whether or not to include content in the CSV. Defaults to `false`.
39+
40+## Requirements & Resources
41+
42+- The Urbit Foundation will connect you with Tlon engineers for 1:1 support, should you need it
43+- Code should be submitted as a pull request against https://github.com/urbit/urbit
44+- The generator shall be called `crunch` (we're open to better ideas)
45+
46+## Milestones
47+
48+
49+### Work is complete
50+1 stars
51+The generator is submitted as a pull request to the Urbit repository, reviewed, and merged.
52+
53+
content/grants/antechamber.mdnew file+104
@@ -0,0 +1,104 @@
1++++
2+title = "Antechamber"
3+date = 2020-11-17
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Antechamber is an initiative to provide a group within Landscape that is restricted to only galaxies and delegates of galaxies."
10+reward = 4
11+assignee = "xiphiness"
12+id = "523261174"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+## Background
19+
20+Galaxy owners have an important place within the Urbit ecosystem: they're expected to [vote on important matters](https://urbit.org/docs/glossary/senate/) related to Urbit's future. We think that galaxies should both a) be able to assemble and communicate with one another, and b) that communication should be undertaken through Urbit itselth. Urbit galaxies, like stars, predominantly fulfill an infrastructural capacity, meaning that galaxy owners will likely interact with Urbit through their personal planet (further, due to the high value of galaxies, it is often the case that their ownership is shared by multiple individuals or a firm).
21+
22+This bounty proposes the use of a *delegate* system, whereby a galaxy can designate another, lower-value ship (*e.g.* a planet) as their delegate in such a way that the designation can be freely given and taken away, as well as be publicly verifiable. This enables ships that represent individuals, like planets, to speak on behalf of galaxies.
23+
24+This use-case is exactly what the [Azimuth Claims contract](https://github.com/urbit/azimuth#overview) is meant to enable. Using claims, our workflow would work like this:
25+
26+- galaxy G makes a claim that planet P is their delegate
27+- planet P makes a claim that they are the delegate for galaxy G (this gives the delegation "acceptance" semantics)
28+
29+Going forward, we'll refer to this pair of claims as a **senate delegate claim**.
30+
31+Assuming such a claim can be made, the next step would be to read/watch them from within Urbit, and then use them to restrict membership in a specified group to just those ships that serve as galactic delegates.
32+
33+## Proposed Architecture
34+
35+### Part 1: Extend Bridge to Support Claims
36+
37+The claims contract is one of the few Azimuth contracts that has not yet been given any form of interface within Bridge. This part of the implementation involves providing a comprehensive interface within Bridge for managing claims.
38+
39+Bridge makes use of the [azimuth-js](https://github.com/urbit/azimuth-js) library for interacting with Azimuth contracts. Initial support for the claims contract was added in [this pull request](https://github.com/urbit/azimuth-js/pull/58/files), although key features are missing—your first task will be to extend the `azimuth-js` library with additional operations:
40+
41+- [`removeClaim`](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L104): remove the specified claim.
42+- [`clearClaims`](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L129): remove all claims.
43+- `getAllClaims`: Produce all claims. *NOTE: There is no contract function for this operation—it'll need to be implemented in terms of `getClaim` per [this comment](https://github.com/urbit/azimuth-js/pull/58#pullrequestreview-369698854).*
44+
45+With the above operations defined, your next task will be to extend Bridge to satisfy the following user stories:
46+
47+#### User Stories
48+
49+(All stories are from the perspective of a point owner, and can be read: "As a point owner, ...")
50+
51+- I can manage Claims by navigating to *ID -> Advanced -> Manage Claims*
52+- I can view all of my claims and their attributes ([`protocol`, `claim` and `dossier`](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L42))
53+- I can remove an existing claim
54+- I can see how many claims I have made of the [maximum number allowed (16)](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L14)
55+- I can understand what claims are for by reading help text in the claims management interface
56+- I can add a new claim
57+- I can add a senate delegate claim using a purpose-built UI
58+ - As a galaxy, I can set my delegate as a planet
59+ - As a planet, I can indicate that I am the delegate of a galaxy
60+
61+### Part 2: Create the `senate-group-hook`
62+
63+This gall agent will make use of the [`eth-watcher` agent](https://github.com/urbit/urbit/blob/master/pkg/arvo/app/eth-watcher.hoon) to watch for [`ClaimAdded`](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L27) and [`ClaimRemoved`](https://github.com/urbit/azimuth/blob/27ab0845779f7beba2376a82b0320c3efb39e03e/contracts/Claims.sol#L34) events, filter just the claim events that reference delegate claims, and translate those events into invites to or kicks from a specified group.
64+
65+#### User Stories
66+
67+All stories that refer to a "group admin" below refer to a group admin that is running the `senate-group-hook`.
68+
69+- As a ship, I can point a locally-running `senate-group-hook` to a group I am the admin/owner of, and it will invite all galactic delegates, becoming a group admin with a senate-hooked group (wordy, I know)
70+- As a group admin, new delegates will be added when senate delegate claims are added
71+- As a group admin, new delegates will be removed when senate delegate claims are removed
72+- As a group admin, all galaxies can also be invited to the group
73+
74+#### Implementation Notes
75+- `eth-watcher` accepts a [`config`](https://github.com/urbit/urbit/blob/6621661460c3073195ac2500df46df67af722cb2/pkg/arvo/sur/eth-watcher.hoon#L5-L21) that tells it which events to watch, among other configuration parameters. An example of its usage can be found [here](https://github.com/urbit/urbit/blob/6621661460c3073195ac2500df46df67af722cb2/pkg/arvo/app/azimuth-tracker.hoon#L86-L97).
76+- Azimuth's events can be found [here](https://github.com/urbit/urbit/blob/6621661460c3073195ac2500df46df67af722cb2/pkg/arvo/sys/zuse.hoon#L7943-L8016) in `zuse.hoon`. It's suggested that you represent the Claims contract and events in a similar fashion in a `/lib` file.
77+- There should be a way to monitor only claim events that originate from galaxies
78+
79+## Deliverables
80+Your solution to this bounty should include pull requests against these repositories:
81+
82+* [azimuth-js](https://github.com/urbit/azimuth-js)
83+* [bridge](https://github.com/urbit/bridge/)
84+* [antechamber](https://github.com/urbit/antechamber): The `senate-delegate-hook`-related files should go here.
85+
86+## Expectations
87+
88+You will work closely with the director of urbit.org on this project. This means that regular check-in calls will be held to discuss the project's progress. Additionally, the you are expected to provide regular status updates on the project to the Urbit community via twice-monthly updates on this bounty.
89+
90+The director will ensure that you have access to the necessary resources to complete this project. All prior work done on this project will be explained and made available to you, and should questions arise that require the expertise of engineers at Tlon, time will be made (schedules permitting) for your questions to be answered either in writing or over a call.
91+
92+## Milestones
93+
94+
95+### Part 1: Extend Bridge to Support Claims
96+2 stars
97+Pull requests to azimuth-js and bridge, as specified above, have been merged.
98+
99+
100+### Part 2: Create the senate-group-hook
101+2 stars
102+Pull requests against the antechamber repo mentioned above have been merged.
103+
104+
content/grants/apprenticeships/_index.mdnew file+4
@@ -0,0 +1,4 @@
1++++
2+title = "Apprenticeships"
3+template = "grant_type/apprenticeships.html"
4++++
content/grants/art-by-urbit.mdnew file+32
@@ -0,0 +1,32 @@
1++++
2+title = "Art by Urbit"
3+date = 2020-08-27
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Art by Urbit will provide a monthly digest of art produced by & for Urbit, on a publicly available website & social media presence."
10+reward = 1
11+assignee = "nartes-fasrum"
12+id = "636838408"
13+completed = false
14+link = ""
15++++
16+
17+With the deployment of Art by Urbit, a central platform & location for the dissemination of Urbit art & propaganda will be available for users of the traditional internet. Regular digests of Urbit art will be collected from willing Urbit users & published on the Art by Urbit website & social media to provide visual inspiration for anyone interested, from those who are taking their first steps on the Martian frontier to those who've been sailing their ship for years.
18+
19+For those already homesteading Urbit, part of the regular digest will be a pair of featured artworks to use with the new Landscape background image feature - one for light-themed browsers, and one for dark-themed. For the curious or the new, art promoting a public group, chat, or notebook will be included to help connect them with Urbit's best communities. A potential longer-term goal would be the production of a physical calendar, with a different Urbit themed art piece for each month and various interesting facts, informational tidbits, or helpful tips scattered throughout. Once Urbit ships can host their own content on the open internet, I aim to host the Art by Urbit site from its own ship.
20+
21+I'm qualified to carry out this proposal as I have built a portfolio of prior Urbit-related art (available [here](https://twitter.com/nartesfasrum) ) and have prior experience building & deploying websites & social media promotional campaigns.
22+
23+
24+
25+## Milestones
26+
27+
28+### Six months of regular digests
29+1 stars
30+As described - six months of regular monthly Art by Urbit digests, posted to the Art by Urbit website & promoted on social media.
31+
32+
content/grants/bart-train-tracker-landscape-tile.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+title = "BART Train Tracker Landscape Tile"
3+date = 2020-03-05
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A backend for a BART client on Urbit."
10+reward = 3
11+assignee = "~ronreg-ribdev"
12+id = "1026701722"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+### Bounty Description
19+
20+Create a backend for importing BART (Bay Area Rapid Transit) arrival and departure data and service alerts via the BART public API to Urbit, and design a Landscape tile which will serve as a route planner app inside Urbit.
21+
22+We would like to create a BART information Landscape tile. The backend should access real-time departure and arrival information for the complete list of stations via the BART API, as well as the data feeds for schedule tables, elevator outages, system advisories, and train counts. The tile interface should encompass:
23+
24+- A real-time trip planner using the BART data, similar to the one on the official BART website.
25+- Links for schedule tables for weekday, weekend, holiday service.
26+- The open-source BART map linked below.
27+- A place (possibly a scrolling feed?) for BART service alerts.
28+- A place for BART elevator closure status (this is a separate data channel).
29+
30+Resources:
31+
32+- [BART API Documentation](http://api.bart.gov/docs/overview/index.aspx)
33+- [BART API Developer License Agreement](https://www.bart.gov/schedules/developers/developer-license-agreement)
34+
35+### Contribution Guidelines:
36+- Do not begin work until your request to claim this bounty is accepted.
37+- Submit your work as a pull request to the [urbit/urbit repo](https://github.com/urbit/urbit/pulls)
38+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
39+- You have 90 days from the time of approval to complete this bounty.
40+- Successful completion of this bounty may result in an invitation to complete other API integration bounties.
41+
42+
43+## Milestones
44+
45+
46+### Your PR is merged
47+3 stars
48+Your code is accepted and merged.
49+
50+
content/grants/bitcoin-full-node-provider-and-wallet.mdnew file+92
@@ -0,0 +1,92 @@
1++++
2+title = "Bitcoin Full Node Provider and Wallet"
3+date = 2020-09-23
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "This bounty covers the creation of infrastructure (gall agents) required to enable a Bitcoin-based payments system from within Landscape."
10+reward = 6
11+assignee = "~timluc-miptev"
12+id = "2056919898"
13+completed = true
14+link = ""
15++++
16+
17+## Introduction
18+Creation of a wallet that supports various currencies is the basis for building an economy in Urbit. Bitcoin is a natural starting point due to both 1) the philosophical alignment with the project, 2) the prior art already done towards this end, and 3) its ubiquity.
19+
20+This bounty covers the creation of a wallet that supports the use of Bitcoin and the infrastructure required to connect ships to the Bitcoin network. You will have the support of the Urbit Foundation in the development of this project, and will work closely with its director to refine requirements and test the resulting system.
21+
22+## Background
23+Starting last year, several bounties were released to implement the Bitcoin JSON RPC API. Later another bounty was released to build a Bitcoin wallet. The RPC API work is now (nearly) complete, but the wallet work is not. The first iteration of the wallet ultimately failed due to lack of clear scope, but provided many valuable ideas that can still be leveraged.
24+
25+The Bitcoin RPC API was a huge lift and provides the foundation needed to complete this bounty. There are still ongoing performance issues with a handful of RPC calls, but they're close to completion—most of the RPC API works fine and shouldn't block this project from getting started.
26+
27+### Resources
28+* [Bitcoin RPC API Pull Request](https://github.com/urbit/urbit/pull/1892)
29+* [Bitcoin RPC API Documentation](https://developer.bitcoin.org/reference/rpc/index.html)
30+* [Original Bitcoin Wallet work](https://github.com/urbit/urbit/tree/mp/bitcoin)
31+
32+## Overview
33+The ultimate goal is to have a wallet application within Landscape that ships can use to send payments to one another using a variety of digital currencies, starting with Bitcoin.
34+
35+In order to make our wallet useful, a bridge from Urbit to the Bitcoin network will need to be built that uses the RPC API to communicate with a full node. In an ideal world each ship would run their own full node—practically, this is unrealistic due to the high technical and resource requirements of running a full node. For this reason, the solution to this bounty should provide a mechanism for ships that do not run a full node to connect to the Bitcoin network via other ships that choose to provide access to their node. Care must be taken to minimize the required amount of trust in this instance.
36+
37+The wallet should be able to represent an "account," which correspond to public/private keypairs (representation of multiple Bitcoin accounts would be nice as well). A Bitcoin account can come from a variety of places: a mnemonic seed, hardware wallet, or from an Urbit master ticket, which is possible due to [Urbit's Hierarchical Deterministic wallet](https://github.com/urbit/fora-posts/blob/master/proposals/posts/~2018.11.8..19.31.59..ba77~.md) structure, which is based on BIP32. Regardless of the source of a keypair, Urbit will store only the public half (the extended public key to be specific—more detail is provided below). Transaction signing, which requires a private key, will be handled outside of Urbit to maintain security best practices.
38+
39+From the wallet application, ships should be able to do payments and check the balance and transaction history for each account. The implementation should respect security best-practices by keeping private keys safe and identity secret to the highest extent as is reasonably possible.
40+
41+### Project Requirements
42+* Ships can send payment in Bitcoin to other ships.
43+* Ships can send payment in Bitcoin to addresses.
44+* Ships can connect to full nodes that they run on their own.
45+* Ships can connect to full nodes operated by other ships.
46+* Private keys are never entrusted to any other entity.
47+* Ships can view the transaction history for any Bitcoin account they own.
48+* Ships can view the balance of any Bitcoin account they own.
49+
50+### User Stories
51+The bridge to the Bitcoin network should satisfy the following stories.
52+* As a ship, I can connect to a full node that I control, becoming a host.
53+* As a ship, I can connect to a full node via another ship, becoming a client.
54+* As a host, I can control which other ships can access my full node.
55+* As a host or client, I can check the balance of my Bitcoin addresses.
56+* As a host or client, I can broadcast a signed transaction to the Bitcoin network.
57+* As a host or client, I can obtain a list of transactions for my Bitcoin account(s).
58+
59+The wallet should satisfy these stories:
60+* As a ship, I can see my overall balance for an account.
61+* As a ship, I can see all transactions for a specific account.
62+* As a ship, I can construct an unsigned transaction.
63+* As a ship, I can send Bitcoin to other ships, becoming a payer.
64+* As a payer, I can tell when my payment has succeeded.
65+* As a ship, I can receive bitcoin from other ships, becoming a payee.
66+* As a payee, I can provide a unique address for each transaction.
67+* As a payee, I can tell when I have received payment.
68+
69+### Proposed Architecture
70+A design for a system that satisfies the above requirements has been outlined [here](https://gist.github.com/jalehman/e0c91071427ca4c349c0673f376945cb). It's not a requirement to use this architecture, but it's probably a good starting place, as it's been vetted by a few people within the community. Ideally the architecture will be further refined collaboratively with you, the claimant.
71+
72+### Expectations
73+You will work closely with the director of urbit.org on this project. This means that, at a minimum, weekly check-in calls will be held to discuss the project's progress. Additionally, the worker is expected to provide regular status updates on the project to the Urbit community via twice-monthly updates on this bounty.
74+
75+The director will ensure that you have access to the necessary resources to complete this project. All prior work done on this project will be explained and made available to you, and should questions arise that require the expertise of engineers at Tlon, time will be made (schedules permitting) for your questions to be answered either in writing or over a call.
76+
77+The worker should have a background that either demonstrates experience building Gall agents, or developing on Bitcoin (or similar crypto systems)--both would be even better.
78+
79+
80+## Milestones
81+
82+
83+### Implement the full node bridge/provider
84+3 stars
85+Create a set of gall agents to interface with a Bitcoin full node, access to which can be provided to other ships.
86+
87+
88+### Implement the wallet
89+3 stars
90+Create a set of gall agents to handle extended public keys, address derivation, and facilitate payments between ships.
91+
92+
content/grants/bitcoin-key-derivation.mdnew file+61
@@ -0,0 +1,61 @@
1++++
2+title = "Bitcoin Key Derivation"
3+date = 2020-10-02
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "The Urbit HD Wallet allows for many different keys to be generated from a single master ticket. Your task is to use this mechanism to generate Bitcoin keys and expose ways of interacting with them."
10+reward = 2
11+assignee = "pkova"
12+id = "794126751"
13+completed = true
14+link = ""
15++++
16+
17+## Overview
18+Our goal is to build a Bitcoin payment experience that allows any ship to use their Urbit ID additionally as an address that can send and receive Bitcoin. Ideally a new ship needs nothing more than Landscape for interacting with the Bitcoin network (see [the Bitcoin Full Node Provider and Wallet bounty](https://grants.urbit.org/bounties/2056919898-bitcoin-full-node-provider-and-wallet)) and their Urbit ID for receiving Bitcoin and signing transactions (this bounty). This provides an easy onramp to working with Bitcoin without compromising on security or privacy.
19+
20+Interacting with Bitcoin private keys, like your Urbit master ticket, requires a secure environment. As long as Urbit remains unaudited, it’s best to not use a master ticket to directly access your Urbit—this is why we built Bridge. [Bridge](https://bridge.urbit.org) is designed to be a secure environment, making it an ideal candidate for handling our sensitive Bitcoin keys.
21+
22+## User Stories
23+This bounty should provide extensions to Bridge that satisfy the following user stories:
24+
25+* As an user, I can obtain my Bitcoin extended public key (xpub).
26+* As an user, I can copy my xpub to the clipboard.
27+* As an user, I can sign a constructed transaction.
28+* As an user, I can copy a signed transaction to the clipboard.
29+
30+For the purposes of this bounty, obtaining an extended public key would consist of copying it to the clipboard for input into Landscape, where the Bitcoin wallet will need it for performing address derivation. Signing a transaction will go in the other direction; a “constructed” transaction (consisting of everything but the signature) will be generated from within Landscape, input into Bridge for signing, and then the signed transaction will be input back to Landscape for broadcasting over the Bitcoin network.
31+
32+While this flow isn’t the most user-friendly, the functionality will ultimately be possible to port into Landscape a) once it runs in a more secure environment (e.g. Electron), and b) once Urbit is receives a thorough security audit.
33+
34+## Deliverables
35+Your solution to this bounty should include pull requests against these repositories:
36+
37+* [urbit-key-generation](https://github.com/urbit/urbit-key-generation): This library is responsible for deriving keys from a master ticket—this is where Bitcoin key generation should occur.
38+* [bridge](https://github.com/urbit/bridge/): Bridge should be extended to include a new top-level “Bitcoin” section, which should provide access to the xpub key and a place for signing transactions.
39+
40+Design mockups will be provided to the worker upon claiming this bounty.
41+
42+## Expectations
43+You will work closely with the director of urbit.org on this project. This means that, at a minimum, weekly check-in calls will be held to discuss the project's progress. Additionally, the worker is expected to provide regular status updates on the project to the Urbit community via twice-monthly updates on this bounty.
44+
45+The director will ensure that you have access to the necessary resources to complete this project. All prior work done on this project will be explained and made available to you, and should questions arise that require the expertise of engineers at Tlon, time will be made (schedules permitting) for your questions to be answered either in writing or over a call.
46+
47+The worker should have a background that demonstrates proficiency with building client-side Javascript applications. Experience working with Bitcoin development is preferred, but not required.
48+
49+### Resources
50+
51+* [Urbit HD Wallet design](https://github.com/urbit/fora-posts/blob/master/proposals/posts/~2018.11.8..19.31.59..ba77~.md)
52+* [BIP-32 re: extended public keys](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#Extended_keys)
53+
54+## Milestones
55+
56+
57+### Work is Complete
58+2 stars
59+Pull requests to each repository have been submitted, reviewed and merged.
60+
61+
content/grants/bitcoin-node-json-rpc-api-part-1.mdnew file+48
@@ -0,0 +1,48 @@
1++++
2+title = "Bitcoin Node JSON RPC API (Part 1)"
3+date = 2019-11-15
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part one."
10+reward = 1
11+assignee = "yosoyubik"
12+id = "649469235"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+To expand Urbit’s Bitcoin-related capabilities, we are building a Gall app which can comprehensively control a Bitcoin Core full node via the JSON RPC API. The app is contained in [this branch](https://github.com/urbit/urbit/tree/btc-node-grant) of the Urbit repo, and the original conception of this idea is discussed [here](https://github.com/urbit/arvo/pull/1052). Our ultimate goal is to create Bitcoin libraries for Urbit, enabling Bitcoin to serve as a "money primitive" for future Gall apps.
19+
20+Bitcoin Core is the reference implementation for Bitcoin nodes, which can be run as _bitcoind_ or _bitcoin-qt_.
21+
22+#### Bounty Description
23+This bounty is to create a portion of the Gall app library for Remote Procedure Calls to a Bitcoin Core full node, written in Hoon. The other portions are covered in these grants: [Two](https://grants.urbit.org/bounties/1577544668-bitcoin-node-json-rpc-api-part-2), [Three](https://grants.urbit.org/bounties/312452925-bitcoin-node-json-rpc-api-part-3), [Four](https://grants.urbit.org/bounties/87854308-bitcoin-node-json-rpc-api-part-4).
24+* Specifically, this bounty is to create types and JSON conversions for commands and responses of the first section of the [Bitcoin Core API reference](https://bitcoincore.org/en/doc/0.18.0/ ), titled “Blockchain”:
25+* Create type definitions in Hoon for structuring commands and responses. Specify poke-action types that map to each command. Use logic specified in Bitcoin Core API resource and the template contained in the guidelines, and fill in this code where appropriate in [`pkg/arvo/lib/btc-node-json.hoon`](https://github.com/urbit/urbit/blob/9bb9b20c71a0a46edc6c52dd869017d3a51ede30/pkg/arvo/lib/btc-node-json.hoon).
26+* The application will be structured as two Gall agents: one “Store” and one “Hook”. The store should act as a data store for data received from the Bitcoin full node, and the Hook should send commands to the node as well as parsing the responses and poking them into the Store. A [template branch](https://github.com/urbit/urbit/tree/btc-node-grant) has been created to set up skeletons of these files to make your work easier.
27+
28+#### Resources
29+* [Store/Hook proposal for userspace architecture](https://docs.google.com/document/d/1hS_UuResG1S4j49_H-aSshoTOROKBnGoJAaRgOipf54/edit?usp=sharing)
30+* [Urbit Gall App documentation](https://urbit.org/docs/learn/arvo/gall/)
31+* Bitcoin Core API reference documentation: [Here](https://bitcoincore.org/en/doc/0.18.0/), [here](https://en.bitcoin.it/wiki/API_reference_(JSON-RPC), and [here](https://bitcoin.org/en/developer-reference#remote-procedure-calls-rpcs).
32+* Distinctions between _bitcoind_ and _bitcoin-qt_: Differences between them discussed [here](https://bitcoin.stackexchange.com/questions/13368/whats-the-difference-between-bitcoind-and-bitcoin-qt-different-commands)
33+* [JSON RPC API standards](https://www.jsonrpc.org/specification)
34+
35+#### Contribution Guidelines
36+* Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
37+* Base your work off of the [btc-node-grant branch](https://github.com/urbit/urbit/tree/btc-node-grant). Follow Boilerplate. Look for `TODO`s.
38+* Submit your code as a PR to the [btc-node-grant](https://github.com/urbit/urbit/tree/btc-node-grant) branch of the `urbit` repo in form of a `.hoon` file.
39+* You have 45 days from the time of approval to complete this bounty.
40+
41+## Milestones
42+
43+
44+### Your PR is merged
45+1 stars
46+Your PR containing all the relevant code updates is accepted and merged.
47+
48+
content/grants/bitcoin-node-json-rpc-api-part-2.mdnew file+48
@@ -0,0 +1,48 @@
1++++
2+title = "Bitcoin Node JSON RPC API (Part 2)"
3+date = 2019-10-01
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part two."
10+reward = 1
11+assignee = "pkova"
12+id = "1577544668"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+To expand Urbit’s Bitcoin-related capabilities, we are building a Gall app which can comprehensively control a Bitcoin Core full node via the JSON RPC API. The app is contained in [this branch](https://github.com/urbit/urbit/tree/btc-node-grant) of the Urbit repo, and the original conception of this idea is discussed [here](https://github.com/urbit/arvo/pull/1052). Our ultimate goal is to create Bitcoin libraries for Urbit, enabling Bitcoin to serve as a "money primitive" for future Gall apps.
19+
20+Bitcoin Core is the reference implementation for Bitcoin nodes, which can be run as _bitcoind_ or _bitcoin-qt_.
21+
22+#### Bounty Description
23+This bounty is to create a portion of the Gall app library for Remote Procedure Calls to a Bitcoin Core full node, written in Hoon. The other portions are covered in these grants: [One](https://grants.urbit.org/bounties/1507085808-bitcoin-node-json-rpc-api-part-1), [Three](https://grants.urbit.org/bounties/312452925-bitcoin-node-json-rpc-api-part-3), [Four](https://grants.urbit.org/bounties/87854308-bitcoin-node-json-rpc-api-part-4).
24+* Specifically, this bounty is to create types and JSON conversions for commands and responses of the sections of the [Bitcoin Core API reference](https://bitcoincore.org/en/doc/0.18.0/ ), titled **“Control”**, **“Generating”**, **“Mining”**, and **“Network”**:
25+* Create type definitions in Hoon for structuring commands and responses. Specify poke-action types that map to each command. Use logic specified in Bitcoin Core API resource and the template contained in the guidelines, and fill in this code where appropriate in [`pkg/arvo/lib/btc-node-json.hoon`](https://github.com/urbit/urbit/blob/9bb9b20c71a0a46edc6c52dd869017d3a51ede30/pkg/arvo/lib/btc-node-json.hoon).
26+* The application will be structured as two Gall agents: one “Store” and one “Hook”. The store should act as a data store for data received from the Bitcoin full node, and the Hook should send commands to the node as well as parsing the responses and poking them into the Store. A [template branch](https://github.com/urbit/urbit/tree/btc-node-grant) has been created to set up skeletons of these files to make your work easier.
27+
28+#### Resources
29+* [Store/Hook proposal for userspace architecture](https://docs.google.com/document/d/1hS_UuResG1S4j49_H-aSshoTOROKBnGoJAaRgOipf54/edit?usp=sharing)
30+* [Urbit Gall App documentation](https://urbit.org/docs/learn/arvo/gall/)
31+* Bitcoin Core API reference documentation: [Here](https://bitcoincore.org/en/doc/0.18.0/), [here](https://en.bitcoin.it/wiki/API_reference_(JSON-RPC), and [here](https://bitcoin.org/en/developer-reference#remote-procedure-calls-rpcs).
32+* Distinctions between _bitcoind_ and _bitcoin-qt_: Differences between them discussed [here](https://bitcoin.stackexchange.com/questions/13368/whats-the-difference-between-bitcoind-and-bitcoin-qt-different-commands)
33+* [JSON RPC API standards](https://www.jsonrpc.org/specification)
34+
35+#### Contribution Guidelines
36+* Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
37+* Base your work off of the [btc-node-grant branch](https://github.com/urbit/urbit/tree/btc-node-grant). Follow Boilerplate. Look for `TODO`s.
38+* Submit your code as a PR to the [btc-node-grant](https://github.com/urbit/urbit/tree/btc-node-grant) branch of the `urbit` repo in form of a `.hoon` file.
39+* You have 45 days from the time of approval to complete this bounty.
40+
41+## Milestones
42+
43+
44+### Your PR is merged
45+1 stars
46+Your PR containing all the relevant code updates is accepted and merged.
47+
48+
content/grants/bitcoin-node-json-rpc-api-part-3.mdnew file+49
@@ -0,0 +1,49 @@
1++++
2+title = "Bitcoin Node JSON RPC API (Part 3)"
3+date = 2019-10-01
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part three."
10+reward = 1
11+assignee = "yosoyubik"
12+id = "312452925"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+To expand Urbit’s Bitcoin-related capabilities, we are building a Gall app which can comprehensively control a Bitcoin Core full node via the JSON RPC API. The app is contained in [this branch](https://github.com/urbit/urbit/tree/btc-node-grant) of the Urbit repo, and the original conception of this idea is discussed [here](https://github.com/urbit/arvo/pull/1052). Our ultimate goal is to create Bitcoin libraries for Urbit, enabling Bitcoin to serve as a "money primitive" for future Gall apps.
19+
20+Bitcoin Core is the reference implementation for Bitcoin nodes, which can be run as _bitcoind_ or _bitcoin-qt_.
21+
22+#### Bounty Description
23+This bounty is to create a portion of the Gall app library for Remote Procedure Calls to a Bitcoin Core full node, written in Hoon. The other portions are covered in these grants: [One](https://grants.urbit.org/bounties/1507085808-bitcoin-node-json-rpc-api-part-1), [Two](https://grants.urbit.org/bounties/1577544668-bitcoin-node-json-rpc-api-part-2), [Four](https://grants.urbit.org/bounties/87854308-bitcoin-node-json-rpc-api-part-4).
24+* Specifically, this bounty is to create types and JSON conversions for commands and responses of the sections of the [Bitcoin Core API reference](https://bitcoincore.org/en/doc/0.18.0/ ) titled **"Raw Transactions"** and **"Util"**
25+* Create type definitions in Hoon for structuring commands and responses. Specify poke-action types that map to each command. Use logic specified in Bitcoin Core API resource and the template contained in the guidelines, and fill in this code where appropriate in [`pkg/arvo/lib/btc-node-json.hoon`](https://github.com/urbit/urbit/blob/9bb9b20c71a0a46edc6c52dd869017d3a51ede30/pkg/arvo/lib/btc-node-json.hoon).
26+* The application will be structured as two Gall agents: one “Store” and one “Hook”. The store should act as a data store for data received from the Bitcoin full node, and the Hook should send commands to the node as well as parsing the responses and poking them into the Store. A [template branch](https://github.com/urbit/urbit/tree/btc-node-grant) has been created to set up skeletons of these files to make your work easier.
27+
28+#### Resources
29+* [Store/Hook proposal for userspace architecture](https://docs.google.com/document/d/1hS_UuResG1S4j49_H-aSshoTOROKBnGoJAaRgOipf54/edit?usp=sharing)
30+* [Urbit Gall App documentation](https://urbit.org/docs/learn/arvo/gall/)
31+* Bitcoin Core API reference documentation: [Here](https://bitcoincore.org/en/doc/0.18.0/), [here](https://bitcoin.org/en/developer-reference#remote-procedure-calls-rpcs).
32+* Distinctions between _bitcoind_ and _bitcoin-qt_: Differences between them discussed [here](https://bitcoin.stackexchange.com/questions/13368/whats-the-difference-between-bitcoind-and-bitcoin-qt-different-commands)
33+* [JSON RPC API standards](https://www.jsonrpc.org/specification)
34+
35+#### Contribution Guidelines
36+* Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
37+* Base your work off of the [btc-node-grant branch](https://github.com/urbit/urbit/tree/btc-node-grant). Follow Boilerplate. Look for `TODO`s.
38+* Submit your code as a PR to the [btc-node-grant](https://github.com/urbit/urbit/tree/btc-node-grant) branch of the `urbit` repo in form of a `.hoon` file.
39+* You have 45 days from the time of approval to complete this bounty.
40+
41+
42+## Milestones
43+
44+
45+### Your PR is merged
46+1 stars
47+Your PR containing all the relevant code updates is accepted and merged.
48+
49+
content/grants/bitcoin-node-json-rpc-api-part-4.mdnew file+48
@@ -0,0 +1,48 @@
1++++
2+title = "Bitcoin Node JSON RPC API (Part 4)"
3+date = 2019-10-01
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Write a Remote Procedure Call library for a Bitcoin Gall app -- part four."
10+reward = 2
11+assignee = "yosoyubik"
12+id = "87854308"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+To expand Urbit’s Bitcoin-related capabilities, we are building a Gall app which can comprehensively control a Bitcoin Core full node via the JSON RPC API. The app is contained in [this branch](https://github.com/urbit/urbit/tree/btc-node-grant) of the Urbit repo, and the original conception of this idea is discussed [here](https://github.com/urbit/arvo/pull/1052). Our ultimate goal is to create Bitcoin libraries for Urbit, enabling Bitcoin to serve as a "money primitive" for future Gall apps.
19+
20+Bitcoin Core is the reference implementation for Bitcoin nodes, which can be run as _bitcoind_ or _bitcoin-qt_.
21+
22+#### Bounty Description
23+This bounty is to create a portion of the Gall app library for Remote Procedure Calls to a Bitcoin Core full node, written in Hoon. The other portions are covered in these grants: [One](https://grants.urbit.org/bounties/1507085808-bitcoin-node-json-rpc-api-part-1), [Two](https://grants.urbit.org/bounties/1577544668-bitcoin-node-json-rpc-api-part-2), [Three](https://grants.urbit.org/bounties/312452925-bitcoin-node-json-rpc-api-part-3).
24+* Specifically, this bounty is to create types and JSON conversions for commands and responses of the sections of the [Bitcoin Core API reference](https://bitcoincore.org/en/doc/0.18.0/ ) titled **"Wallet"** and **"ZMQ"**.
25+* Create type definitions in Hoon for structuring commands and responses. Specify poke-action types that map to each command. Use logic specified in Bitcoin Core API resource and the template contained in the guidelines, and fill in this code where appropriate in [`pkg/arvo/lib/btc-node-json.hoon`](https://github.com/urbit/urbit/blob/9bb9b20c71a0a46edc6c52dd869017d3a51ede30/pkg/arvo/lib/btc-node-json.hoon).
26+* The application will be structured as two Gall agents: one “Store” and one “Hook”. The store should act as a data store for data received from the Bitcoin full node, and the Hook should send commands to the node as well as parsing the responses and poking them into the Store. A [template branch](https://github.com/urbit/urbit/tree/btc-node-grant) has been created to set up skeletons of these files to make your work easier.
27+
28+#### Resources
29+* [Store/Hook proposal for userspace architecture](https://docs.google.com/document/d/1hS_UuResG1S4j49_H-aSshoTOROKBnGoJAaRgOipf54/edit?usp=sharing)
30+* [Urbit Gall App documentation](https://urbit.org/docs/learn/arvo/gall/)
31+* Bitcoin Core API reference documentation: [Here](https://bitcoincore.org/en/doc/0.18.0/), [here](https://bitcoin.org/en/developer-reference#remote-procedure-calls-rpcs).
32+* Distinctions between _bitcoind_ and _bitcoin-qt_: Differences between them discussed [here](https://bitcoin.stackexchange.com/questions/13368/whats-the-difference-between-bitcoind-and-bitcoin-qt-different-commands)
33+* [JSON RPC API standards](https://www.jsonrpc.org/specification)
34+
35+#### Contribution Guidelines
36+* Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
37+* Base your work off of the [btc-node-grant branch](https://github.com/urbit/urbit/tree/btc-node-grant). Follow Boilerplate. Look for `TODO`s.
38+* Submit your code as a PR to the [btc-node-grant](https://github.com/urbit/urbit/tree/btc-node-grant) branch of the `urbit` repo in form of a `.hoon` file.
39+* You have 90 days from the time of approval to complete this bounty.
40+
41+## Milestones
42+
43+
44+### Your PR is merged
45+2 stars
46+Your PR containing all the relevant code updates is accepted and merged.
47+
48+
content/grants/bitcoin-wallet-on-bridge.mdnew file+59
@@ -0,0 +1,59 @@
1++++
2+title = "Bitcoin Wallet on Bridge"
3+date = 2019-12-09
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Azimuth"]
7+[extra]
8+image = ""
9+description = "Add Bitcoin support to the Bridge interface. "
10+reward = 1
11+assignee = "yosoyubik"
12+id = "273059635"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+### Background
19+
20+To expand Urbit’s Bitcoin-related capabilities, this bounty is to add Bitcoin support to the Urbit wallet on bridge.urbit.org. Our ultimate goal is to create Bitcoin libraries for Urbit, enabling Bitcoin to serve as a ‘money primitive’ for future Gall apps.
21+
22+### Bounty Description
23+
24+Create an SPV (simple payment verification) Bitcoin wallet within [Bridge](https://bridge.urbit.org). Bridge is written in React; please conform to the code style Bridge has thus far been written in.
25+
26+A completed wallet should:
27+- Use the bitcoinjs-lib library for generating transactions and interfacing with Bitcoin
28+- Display Bitcoin balance (display as individual UTXOs)
29+- Generate new addresses to receive Bitcoin
30+- Support transaction signing and ability to broadcast to a full node specified by the node’s domain name
31+- Reuse login credentials to generate Bitcoin wallets / derivation path
32+- When logged in with a master ticket, use the ownership mnemonic.
33+- When logged in with a BIP 39 mnemonic, use that as-is.
34+- Then, proceed as per BIP32
35+
36+### Resources
37+
38+- [Bitcoin Core SPV wallet reference](https://bitcoin.org/en/operating-modes-guide#simplified-payment-verification-spv)
39+- [JS Library to interact with SPV wallet](https://github.com/bitcoinjs/bitcoinjs-lib)
40+- [The Bridge repository](https://github.com/urbit/bridge)
41+- [Urbit Wallet Reference](https://github.com/urbit/fora-posts/blob/master/proposals/posts/~2018.11.8..19.31.59..ba77~.md)
42+- [Urbit Wallet Key Generation](https://github.com/urbit/urbit-key-generation]
43+- [BIP 32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
44+- [BIP 39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)
45+
46+### Contribution Guidelines
47+- Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
48+- Bounty claimant should have a good working knowledge of React and Bitcoin transactions.
49+- Submit your code as a PR to the [Bridge](https://github.com/urbit/bridge) repository.
50+- You have 45 days from the time of approval to complete this bounty.
51+
52+## Milestones
53+
54+
55+### Pull request is accepted
56+1 stars
57+Your pull request containing all of the relevant code has been merged.
58+
59+
content/grants/boston-t-train-tracker-landscape-tile.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Boston T Train Tracker Landscape Tile"
3+date = 2020-03-24
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Create a landscape tile that tracks the Boston T train."
10+reward = 3
11+assignee = "nforbes6"
12+id = "2039941382"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+### Bounty Description
19+
20+Create a backend for importing MBTA (Massachusetts Bay Transportation Authority) T Train arrival and departure data and service alerts via the MBTA public API to Urbit, and design a Landscape tile which will serve as a route planner app inside Urbit.
21+
22+We would like to create a T Train information Landscape tile. The backend should access real-time departure and arrival information for the complete list of stations via the MBTA API, as well as the data feeds for schedule tables, elevator outages, and customer alerts. The tile interface should encompass:
23+
24+- A real-time trip planner using the MBTA data, similar to the one on the official MBTA website.
25+- Links for schedule tables for weekday, weekend, and holiday service.
26+- A link to the official MBTA L Train map linked below, or an open-source workaround.
27+- A place (possibly a scrolling feed?) for MBTA alerts, using the ‘Alerts’ API stream.
28+- A place for MBTA station facilities closure status information.
29+
30+### Resources:
31+
32+- [MBTA V3 API Feeds](https://www.mbta.com/developers/v3-api)
33+- [MBTA Developer Resources](https://www.mbta.com/developers/resources)
34+- [MDOT API Developer License Agreement](https://www.mass.gov/files/documents/2017/10/27/develop_license_agree_0.pdf)
35+
36+## Contribution Guidelines:
37+
38+- Do not begin work until your request to claim this bounty is accepted.
39+- Do not use copyrighted images, including the MBTA logo or the official route map. Instead, always refer to MBTA in plaintext. You should include an external link to the T Train route map; do not host this map locally (we are open to an open-source, good quality route map which does not include the MBTA logo or other trademarks, however).
40+- Please read the Developer License Agreement carefully and obey their guidelines for application naming and presentation of API data.
41+- Submit your work as a pull request to the [urbit/urbit](https://github.com/urbit/urbit/pulls) repo
42+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
43+- You have 90 days from the time of approval to complete this bounty.
44+- Successful completion of this bounty may result in an invitation to complete other API integration bounties.
45+
46+
47+
48+## Milestones
49+
50+
51+### Your PR is merged
52+3 stars
53+Your code is accepted and merged.
54+
55+
content/grants/bounties/_index.mdnew file+4
@@ -0,0 +1,4 @@
1++++
2+title = "Bounties"
3+template = "grant_type/bounties.html"
4++++
content/grants/calendar-ui.mdnew file+53
@@ -0,0 +1,53 @@
1++++
2+title = "Calendar UI"
3+date = 2020-07-16
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Build a Landscape-native calendar UI"
10+reward = 2
11+assignee = "finled-bansel"
12+id = "1555464949"
13+completed = false
14+link = ""
15++++
16+
17+# Purpose
18+
19+A calendar is an indispensible personal tool to many people. A [previous proposal](https://grants.urbit.org/proposals/1851255517) has started work on an Urbit-native calendar. This previous proposal seeks to create a parser and a Gall agent to manage the data layer of a calendar app.
20+
21+The current proposal aims to create a Landscape tile and app to improve the accessibility of a Calendar Gall app. The Calendar UI will provide several screens to interact with the calendar. These are a monthly view, a daily view and a page to create new events.
22+
23+# Implementation and deliverables
24+
25+The UI will be backed by the calendar app implementation described in the aforementioned previous proposal. In order to allow the parallel implementation of a UI and the Gall app, this proposal will be executed in two stages.
26+
27+The first stage is the development of working prototypes of the screens that the calendar will initially support. These include:
28+ - a monthly view with clickable dates to daily views;
29+ - a daily view that lists the events in chronological order with a short description
30+ - a form to create new events with fields for the required properties per RFC 5545.
31+
32+The deliverables will be functional web pages that can be integrated with Landscape. The screens will be built entirely with components from the [Indigo-react](https://github.com/urbit/indigo-react) library.
33+The UI will be built with the assumption that event participants are ships.
34+
35+The second stage is to integrate the screens with the Gall agent implemented as part of the first proposal. This takes a dependency on a correctly functioning calendar Gall app. The requisite
36+
37+# Basis for future integration
38+
39+These pages can provide the basis for UX experiments and integrations with other parts of Landscape. One possibility is to integrate notebook posts with the timeline of a calendar, allowing a temporal exploration of the notebook posts a ship has seen.
40+
41+## Milestones
42+
43+
44+### Functional pages
45+1 stars
46+Build the necessary pages that will allow Landscape to interact with a Calendar Gall app
47+
48+
49+### Working integration with Gall app
50+1 stars
51+Fully capable of importing an .ics calendar, creating new events, looking through existing events in the calendar of a ship.
52+
53+
content/grants/calendar.mdnew file+115
@@ -0,0 +1,115 @@
1++++
2+title = "Calendar"
3+date = 2020-05-19
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "An Arvo calendar agent based on the iCalendar spec."
10+reward = 5
11+assignee = "~wolref-podlex, sovmep-ripsum"
12+id = "1851255517"
13+completed = true
14+link = ""
15++++
16+
17+## Purpose
18+
19+Urbit provides a growing set of tools for communication with groups of people, but is sorely missing a native calendar. For those of us looking to get away from big G for managing our schedules (i.e. everyone reading this) a calendar is an indispensable tool to have in Urbit.
20+
21+Calendars are a sizable undertaking both in terms of data management (modeling & persistence) and user interface, so the authors have decided to limit the scope of this proposal to the data layer, leaving a polished user interface for a future proposal.
22+
23+## Deliverables
24+
25+The goal of this proposal is to create a gall agent that can be used to store a calendar of events on a ship, and to expose calendars as an additional pubsub channel in the same vein as chats, links and notebooks. Additionally, we'll provide accompanying generators for creator, importing events from `.ics` files and direct creation of events.
26+
27+## Team
28+
29+Josh Lehman (~wolref-podlex), has been following Urbit since ~2014 when it first began appearing on Hacker News. In the interim he's been working on Starcity, where he leads the software arm of the business. While new(ish) to Hoon, Josh is no stranger to functional programming, having worked in Clojure for the better part of the last six years.
30+
31+Raghu Nimmagadda (~sovmep-ripsum), is a software engineer with a fair amount of FP experience (Racket, Ocaml, some Haskell). While he's fairly new to Urbit, he's interested in learning and building his hoon skills (recently graduated hoon school 101 and is working on a gall app in his free time).
32+
33+## iCalendar
34+
35+### Rationale
36+
37+The goal is to allow import from iCalendar, but not export to it. There's no reason this couldn't be done, but we're trying to drive towards "calendaring within Urbit" moreso than "calendaring between Urbit and Earth tech." We believe this is more in line with an apparent guiding philosophy behind other applications built so far.
38+
39+So, why base anything on iCalendar at all? Two reasons:
40+
41+1. It's prior art on how a calendaring system should work, which by all appearances works pretty well. As neither of us have experience with building a calendar (and wouldn't exactly call ourselves "calendar researchers"), this seems like a good starting point that should provide ample guidance on the domain-specific components.
42+2. A way to import an existing calendar into Urbit would be a cool feature anyways, since many of us (...or at least some people we know) have personal calendars that should really be on a personal server.
43+
44+We expect to create and maintain a useful degree of iCalendar compatibility, and to also make Urbit-specific deviations on an as-needed basis.
45+
46+### Parser Overview
47+
48+The parser will parse `.ics` files containg VEVENTs into hoon data structures. This will not support top level calendar properties, i.e. properties that apply to the entire calendar, but will support the following required component properties for `VEVENT` as per RFC 5545.
49+
50+```
51+UID
52+DTSTAMP
53+DTSTART
54+DTEND
55+DURATION
56+```
57+
58+The following optional component properties will also be supported.
59+
60+```
61+CATEGORIES
62+CLASS
63+COMMENT
64+DESCRIPTION
65+SUMMARY
66+ORGANIZER
67+GEO
68+LOCATION
69+STATUS
70+RRULE
71+RDATE
72+EXDATE
73+```
74+
75+The goal of this step is to have something that can parse a `.ics` like this (example taken from RFC 5545). A full list of component properties can be found [here](https://tools.ietf.org/html/rfc5545#section-3.1).
76+
77+```
78+BEGIN:VCALENDAR
79+VERSION:2.0
80+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
81+BEGIN:VEVENT
82+UID:19970610T172345Z-AF23B2@example.com
83+DTSTAMP:19970610T172345Z
84+DTSTART:19970714T170000Z
85+DTEND:19970715T040000Z
86+SUMMARY:Bastille Day Party
87+END:VEVENT
88+END:VCALENDAR
89+```
90+
91+If time permits, we'd also want to support parsing VALARM components, which correspond to alarms/reminders about events. These components can be nested within VEVENTs, and have three flavors - audio, display, and email (each representing the kind of reminder the component can give you). We aim to support parsing display alarms (displaying some text) initially, as audio is only useful once a UI is built and we don't have email on mars. While handling the alarms is outside the scope of this proposal, by parsing them we hope to make it easy for future proposals to build on them.
92+
93+## Milestones
94+
95+
96+### VEVENT Parser
97+1 stars
98+A generator that can parse `.ics` files from the dojo containing VEVENTs into hoon data structures. This milestone will NOT support top-level calendar properties.
99+
100+
101+### Calendar Gall Agent
102+1 stars
103+Creation of a gall agent that can be used to persist and read events from `.ics` files into a "calendar" on the running ship.
104+
105+
106+### Gall Agent Enrichment
107+1 stars
108+Extend the gall agent to support queries (e.g. within a range), updates and deletes of events, and a generator to create events without use of `.ics` files.
109+
110+
111+### Pubsub/Channel Support
112+2 stars
113+Extend the gall agent to allow pubsub with other ships and integration with Groups to ultimately allow calendars to exist as an additional channel.
114+
115+
content/grants/comprehensive-local-server-and-mum-explanation-video.mdnew file+41
@@ -0,0 +1,41 @@
1++++
2+title = "Comprehensive local, server and mum explanation video"
3+date = 2021-01-31
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Series of three videos:1) Purchase planet, install and run on a local machine2) nginx setup3) Explaining Urbit to my tech illiterate mum "
10+reward = 1
11+assignee = "mislyr-midnyt"
12+id = "2020133197"
13+completed = false
14+link = ""
15++++
16+
17+# Scope
18+
19+## First video
20+Create a comprehensive video describing how to purchase (or obtain) and run an Urbit planet. Brief overview on how to use Urbit. Mention hosting providers (Tlon) for those who don't want to do this.
21+
22+## Second Video
23+Instruct on how to register a domain name, provision a VPS, setup DNS and create an nginx reverse proxy to create a publicly accessible Let's Encrypt secured public facing Urbit.
24+
25+## Third Video
26+Explain Urbit in a simple way to my sister and technologically illiterate mum. It can be somewhat difficult to explain Urbit to people, so this video should provide an overview for people with no technical knowledge.
27+
28+# Additional Info
29+
30+Videos will be entertaining and engaging, not entirely dissimilar to voice messages posted on urbit-community. Reckon this will be a good way to allow people to very easily onboard onto the network.
31+
32+Granted star would be used to onboard friends, family and people from the easypeasymethod.org community (currently Discord server).
33+
34+## Milestones
35+
36+
37+### Record, edit and upload all videos
38+1 stars
39+Upload all three videos to Youtube, post links in proposal updates.
40+
41+
content/grants/content-saver.mdnew file+45
@@ -0,0 +1,45 @@
1++++
2+title = "Content Saver"
3+date = 2020-03-20
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Extract and save content from HTML."
10+reward = 2
11+assignee = "lurodrigo (~tirdyr-lagrum)"
12+id = "1163181298"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+Build an endpoint that enables the extraction of a web-pages content from HTML. The backend functionality of the [Instapaper](https://www.instapaper.com/) app should be the model here, as should the [Reader from Firefox](https://github.com/mozilla/readability).
19+
20+This app should be able to: Copy both a given highlighted block of text, or a discrete page in Urbit’s blog/Publish application, give the user the option of renaming it, and save it in Markdown to the user’s Urbit planet or ship.
21+
22+If you have a web scraper that can go out and fetch web pages for you, like the one indicated in [this bounty](https://grants.urbit.org/bounties/1967189374-web-scraper), you can just poke the Publish app to save it and be able to read it in Publish. (Note: this bounty is not to build a web scraper, but simply the content-extraction component)
23+The file should strip the content out of HTML and save it into the Markdown format.
24+
25+### Resources:
26+
27+- [The Instapaper API](https://www.instapaper.com/api)
28+- [Firefox Readability](https://github.com/mozilla/readability); this implementation can be copied to the extent that you desire.
29+
30+### Contribution Guidelines:
31+
32+- Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
33+- Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
34+- Submit your code as a PR to the [urbit](github.com/urbit/urbit] repository.
35+- You have 90 days from the time of approval to complete this bounty.
36+
37+
38+## Milestones
39+
40+
41+### PR is merged
42+2 stars
43+Your code is accepted and merged.
44+
45+
content/grants/cross-platform-desktop-urbit-app.mdnew file+85
@@ -0,0 +1,85 @@
1++++
2+title = "Cross-Platform Desktop Urbit App"
3+date = 2021-02-23
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "A native app that makes running Urbit near friction-less for everyone."
10+reward = 10
11+assignee = "nocsyx-lassul"
12+id = "740109059"
13+completed = false
14+link = ""
15++++
16+
17+# Taisho, A native cross-platform desktop Urbit app
18+
19+## Introduction
20+Urbit is gaining momentum, and soon we'll have apps that people really want to use. Currently people from outside Urbit see joining as something of a hassle or time investment that they may not want to make. Taisho will help alleviate those fears and ease people into the process of joining Urbit by running it for them.
21+
22+## Features
23+The main feature of Taisho is that it runs Urbit for you, offering a simple interface without need for explanation to get running.
24+
25+- Ease of install, simply download and run
26+- Boots and runs new and existing planets, moons and comets (maybe stars in the future)
27+- **Ship management**: keeps track of ships, auto-resumes ships when launching, giving them a user selected name, place them in a folder of your choosing, one-click ejection for moving to hosting
28+- **Azimuth integration**: operates locally for greater security
29+ - generate arvo keyfile for booting planets
30+ - handles keyfiles for user making first time booting less complicated
31+ - ensures keyfiles get deleted after use
32+
33+## Potential Future Paths Unlocked
34+- **Plugin/Marketplace system**: would open pathways for easy transitions to hosting, planet buying, downloading and managing Urbit apps/plugins
35+- **Native integration**: if we were to integrate Landscape, Taisho could provide a bridge to OS operations that might be currently difficult to accomplish with the Urbit binary.
36+- **Education**: operations being run could be exposed through the UI so that people could learn what's going on behind the scenes in context.
37+
38+## App Architecture
39+The current architecture is an Electron app which wraps the Urbit binary. This gets packaged into a simple zip or package installer which can be run immediately.
40+
41+### Electron
42+The app uses principles based on this article by James Long, [The Secret of Good Electron Apps](https://archive.jlongster.com/secret-of-good-electron-apps). It is split into a main, renderer, and background process which keeps performance high. Urbit itself is spawned as a separate process which also helps keep things performant.
43+
44+### Front-end
45+The renderer or front-end of the app is built with React, Typescript, and TailwindCSS. This should allow people who have worked on Landscape to have familiarity, and give an easier path if we were to incorporate Landscape itself in the future.
46+
47+## Current Progress
48+Currently, Taisho is able to run on both MacOS and Linux. It can boot new comets, keep record of comets booted with it, and resume the Urbit process of the comet if it gets killed. It is code-signed with Apple so that it can be distributed easily and not require special permissions.
49+
50+## Star Usage
51+If awarded stars, most of them would go towards offering the ability to purchase planets and immediately host them from a service I plan to build in the future, after reaching a stable point in Taisho.
52+
53+## Final Thoughts
54+People like to jump in and experiment with things first. I think this app provides an extremely easy way to do that before committing to spending time on the network, getting hosting or buying a dedicated device, because it provides a no-knowledge way of running Urbit. It also opens a lot of avenues for Urbit. For one, it can be a kind of hub for different services, plugins, apps etc. Another possibility is embedding Landscape, to bring features that wouldn't be possible in a plain web app. I think Taisho can act as a helpful guide for many people's first trek into Urbit.
55+
56+---
57+
58+## About Me
59+My name is Hunter Miller, and I've been building on the web for 7 years. I currently work as a Senior Software Engineer for This Dot building websites and web apps for our clients. I'm focused on delivering the best user experience, which takes delicate coordination between back-end and front-end architecture to really achieve near-perfection. Throughout my time as a developer I've gained a variety of experience starting at an advertising and design agency, moving to a half a billion dollar e-commerce website, and then on to a high-level contracting and consulting firm.
60+
61+You can checkout [my website](https://hmiller.dev/), [LinkedIn](https://www.linkedin.com/in/hunter-miller-dev/), and [Twitter](https://twitter.com/hmillerdev) to see more about me.
62+
63+## Milestones
64+
65+
66+### Ability to run basic ship features
67+1 stars
68+Includes start/stop/restart ship, show status, eject ship for hosting, boot new planets, moons, and comets, boot existing planets and comets, act as browser for hosted ships, and ship removal.
69+
70+
71+### (Timeboxed) Proof of Concept for Windows
72+1 stars
73+To include the Windows' user base, the PoC should enable running on Windows either through WSL or some other means. Two week timebox to make sure we don't spend too much time here.
74+
75+
76+### Urbit Client Beta Release
77+4 stars
78+Significant testing during this time. Cross-platform, include all basic ship features, with no major bugs. Renamed to Urbit Client and added to urbit.org as an easy download.
79+
80+
81+### Azimuth Integration and Official Release
82+4 stars
83+Integrating Urbit key generation for easy booting of new planets. Adding further refinements to UI, all moderate issues resolved, and documentation for users and contributors.
84+
85+
content/grants/cta-train-tracker-landscape-tile.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+title = "CTA Train Tracker Landscape Tile"
3+date = 2020-03-18
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Build an app to track the schedule of the Chicago Transit Authority."
10+reward = 3
11+assignee = "tomnash"
12+id = "1262889675"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+### Bounty Description
19+
20+Create a backend for importing CTA (Chicago Transit Authority) L Train arrival and departure data and service alerts via the CTA public API to Urbit, and design a Landscape tile which will serve as a route planner app inside Urbit.
21+
22+We would like to create a L Train information Landscape tile. The backend should access real-time departure and arrival information for the complete list of stations via the CTA API, as well as the data feeds for schedule tables, elevator outages, and customer alerts.
23+
24+The tile interface should encompass:
25+
26+- A real-time trip planner using the CTA data, similar to the one on the official CTA website.
27+- Links for schedule tables for weekday, weekend, and holiday service.
28+- A link to the official CTA L Train map linked below, or an open-source workaround.
29+- A place (possibly a scrolling feed?) for CTA alerts, using the ‘Customer Alerts’ API.
30+- A place for CTA station elevator closure status information.
31+
32+### Resources
33+- [CTA Developer Center](https://www.transitchicago.com/developers/)
34+- [CTA Branding Guide for Open API Apps](https://www.transitchicago.com/developers/branding/)
35+- [CTA Developer License Agreement](https://www.transitchicago.com/developers/terms/C)
36+
37+### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- Please note that this bounty is for the CTA Train API and not for the CTA Bus API.
40+- Do not use copyrighted images, including the CTA logo or the official route map. Instead, always refer to CTA in plaintext, and use the provided train image which is detailed in the above Developer License Agreement link. You should include an external link to the CTA L Train route map; do not host this map locally (we are open to an open-source, good quality route map which does not include the CTA logo or other trademarks, however).
41+- Please read the Developer License Agreement and Branding Guide carefully and obey their guidelines for application naming and presentation of API data.
42+
43+## Milestones
44+
45+
46+### Your PR is merged
47+3 stars
48+Your code is accepted and merged.
49+
50+
content/grants/display-eth-data.mdnew file+56
@@ -0,0 +1,56 @@
1++++
2+title = "Display ETH Data"
3+date = 2020-01-31
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "The Urbit identity system uses a suite of Ethereum contracts as its PKI. As such, a lot of Ethereum-related functionality is available within the system."
10+reward = 1
11+assignee = "dominic22"
12+id = "831044524"
13+completed = true
14+link = ""
15++++
16+
17+### Bounty Description
18+
19+Create a gall application, and a user interface for that application, that are used to view events on any given Ethereum contract. Both components must meet the specifications enumerated below.
20+
21+##### Gall application
22+
23+- Depends upon /app/eth-watcher
24+- Based on contract address and ABI (json), subscribes to all contract events.
25+- Based on contract address, ABI, and event names/parameters, subscribe to specific events.
26+- Set up with just contract address, retrieving ABI from etherscan.io API.
27+- Stores lists of events and relevant details per contract and config, and make them available to the user interface.
28+
29+##### User interface
30+
31+- Allows adding/removing watched contracts per the above app interface.
32+- Displays events, per contract+config or for all watched, in readable format (ie, "Transfer: from: 0xabc, to: 0xdef, value: 123", with block number or timestamp, link to transaction on Etherscan.")
33+- Allows visual filtering of listed events.
34+
35+### Resources
36+
37+- The [eth-watcher](https://github.com/urbit/urbit/blob/master/pkg/arvo/app/eth-watcher.hoon) code.
38+- [Ethereum ABI value decoding stdlib](https://github.com/urbit/urbit/blob/4915ceb96bdd56f5b1f25504d1c68f8d41161540/pkg/arvo/sys/zuse.hoon#L8317)
39+- [Ethereum Contract APIs](https://etherscan.io/apis#contracts)
40+
41+### Contribution Guidelines
42+
43+- Do not begin work until your request to claim this bounty is accepted.
44+- Email your work to grants@urbit.org.
45+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
46+- You have 90 days from the time of approval to complete this bounty.
47+
48+
49+## Milestones
50+
51+
52+### Work is finished
53+1 stars
54+Your work has been finished and accepted.
55+
56+
content/grants/docker-image-for-cloud-container-orchestration.mdnew file+46
@@ -0,0 +1,46 @@
1++++
2+title = "Docker image for cloud container orchestration"
3+date = 2020-12-21
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = ""
9+description = "Nix infrastructure to generate Docker images for Urbit releases. Images would be suitable for cloud orchestration in e.g. Amazon ECS"
10+reward = 1
11+assignee = "Edward Amsden ~ritpub-sipsyl"
12+id = "626138244"
13+completed = true
14+link = ""
15++++
16+
17+Many cloud providers offer container orchestration services that abstract away from managing servers or compute instances (e.g. Amazon ECS, Azure Container Instances). A docker image tagged for the latest version of Urbit would drastically simplify the process of deploying urbits to the cloud, which is preferable for planets, stars, and galaxies.
18+
19+# Deliverables
20+- A merged pull request to the urbit/urbit repository, with nix code to generate a docker image
21+ * With a volume-mountable path for a ship
22+ * With a volume-mountable path for a keyfile
23+- CI integration to release the docker image as a GitHub artifact when version releases of Urbit are cut
24+- CI integration to publish the image on Docker Hub when version releases of Urbit are cut
25+- Documentation:
26+ - Reference for volume mounts and controlling the behavior of Urbit in a container
27+ * Volume mount points for keyfiles or existing ships
28+ * Ports to publish for Landscape and external API access.
29+ - Quickstarts for deploying an Urbit ship to
30+ - Amazon ECS
31+ - Azure Container Instances
32+
33+# Team
34+Edward Amsden ~ritpub-sipsyl is a veteran developer with several years experience using Nix to manage production builds and deployments. He is the principal of Black River Software LLC
35+
36+## Milestones
37+
38+
39+### Merged PR: Nix docker integration
40+1 stars
41+- Nix code to generate an Urbit docker image
42+- CI integration to release docker images on GitHub
43+- CI integration to publish docker images on Docker Hub
44+- Documentation
45+
46+
content/grants/educational-guide-todomvc-urbit-edition.mdnew file+331
@@ -0,0 +1,331 @@
1++++
2+title = "Educational Guide: TodoMVC, Urbit Edition"
3+date = 2021-01-05
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "The goal of this bounty is to create a series of guides that can instruct a newcomer to Urbit as to how to go about creating a full-stack application from scratch."
10+reward = 10
11+assignee = "~rabsef-bicrym"
12+id = "1372696624"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+
19+The goal of this bounty is to create a series of guides that can instruct a
20+newcomer to Urbit as to how to go about creating a full-stack application from
21+scratch. Together, they'll form a an introductory course to development on
22+Urbit.
23+
24+The application we'll demonstrate is the classic [TodoMVC](http://todomvc.com/examples/react/#/) app, which many
25+developers will be immediately familiar with. Even if a newcomer isn't familiar
26+with TodoMVC, it's quite easy to get a handle on it because it's a todo
27+list--surely *everyone* at this point has experience with todo lists.
28+
29+The classic TodoMVC example is a simple, functional and aesthetically pleasing
30+web-based todo list. What it lacks, however, is any form of persistence or
31+collaborative qualities; both of which are complex undertakings with traditional
32+web development. Our guide will demonstrate just how simple it is to give an
33+application these capabilities on Urbit, leading to a production-ready application.
34+
35+## Part 1: Serving Static Content
36+
37+Urbit ships with a web server called `eyre` which can do most of the things that
38+any other web server can, including serving static content, like a single page
39+application.
40+
41+By default, your Urbit is configured to serve Landscape at the `/` and
42+`/~landscape` URIs. Landscape is a single-page application that performs its own
43+client-side routing, but it's also possible to serve other applications as well.
44+For reference, see the
45+[debug](https://github.com/urbit/urbit/blob/959b585b384f66e54421f70f95d6d152077907bb/pkg/arvo/app/dbug.hoon)
46+application, which is a standalone application served from the `/~debug` URI.
47+
48+Our goal is to serve a pre-built `TodoMVC` application at the route `/~todo`.
49+It's important to note that this process could be applied to serve *any* HTML
50+file, whether it's a single-page application or not. With very little
51+imagination, it becomes easy to see how one could serve their personal blog at
52+`/~blog`, or a static "About Me" page at `/~about`.
53+
54+Urbit as a personal *file* server is useful in and of itself, but it will
55+require a basic understanding of Hoon, Clay, Gall, and the development
56+environment more generally. We'll break this guide into two sections: one
57+focused on getting a development environment set up, and another on actually
58+using it.
59+
60+### Part 1a: Setting up your Development Environment
61+
62+This section is fairly straightforward, as it has been covered many times
63+before. ~timluc-miptev's gall guide has a [great
64+overview](https://github.com/timlucmiptev/gall-guide/blob/master/workflow.md#three-workflow-options)
65+of how to work with fake ships efficiently, and the existing documentation has
66+plenty of material material.
67+
68+After the basic process of getting started, we'll want to cover how to develop
69+against a separate project repo, why you'd want to do that, how files are synced
70+with development ships (this is essentially the "deployment process"), and how
71+to use some basic generators.
72+
73+This guide should satisfy the following user stories, each of which start with
74+*As a new developer reading this guide, ...*:
75+
76+- I can install the Urbit binary.
77+- I can boot a fake ship for development.
78+- I can mount a pier.
79+- I can create new fake ships quickly.
80+- I have set up a project repository for my code.
81+- I understand the relationship between my project repository and my ship.
82+- I can copy files from my project repository to my ship.
83+- I can use a generator to inspect the contents of copied files.
84+
85+### Interlude: Hoon, Clay and Generators
86+
87+At this point it's probably worth digging a little deeper into some of the
88+things that were skimmed over in the last part. For starters, we did a good
89+amount of work with `clay` in the last lesson without really digging into what
90+it is or how it works.
91+
92+To start, let's talk a bit about what a pier is and its relation to the unix
93+filesystem, the way files are represented and how to navigate our pier from
94+within Urbit (*e.g.* `+ls %`, `+cat %/gen/cat`), and what `|mount` and `|commit`
95+are doing (at a high level).
96+
97+That might be a good segue into some basic Hoon via a super simple
98+generator--just enough to explain important syntax rules (*e.g.* ace v. gap),
99+the concept of runes, and provide links to places where you can learn more about
100+all of these things.
101+
102+### Part 1b: Serving the TodoMVC Application
103+
104+This section covers the process of serving static content to a URI within your
105+Urbit.
106+
107+First, you'll need to select a version of TodoMVC to use. For a modern and
108+widely understood version, I'd recommend the
109+[react-hooks](https://github.com/tastejs/todomvc/tree/master/examples/react-hooks)
110+version.
111+
112+The meat of this section is really in creating a simple gall agent that can be
113+used to serve the TodoMVC app directory. There are two ways you could go about
114+this: a) use the `file-server` agent, or b) use `eyre` directly, as is done with
115+the
116+[`dbug`](https://github.com/urbit/urbit/blob/959b585b384f66e54421f70f95d6d152077907bb/pkg/arvo/app/dbug.hoon)
117+application. Regardless of which option is chosen, a demonstration of the
118+conversion from one to the other would be an informative bonus lesson.
119+
120+By the end of this lesson:
121+
122+- I understand what Gall is at a high level.
123+- I know what an *agent* is.
124+- I know how to start a gall agent.
125+- I can serve a static file (or directory of files) from a URI on my ship.
126+
127+## Part 2: Data Modeling
128+
129+Now that we can serve a TodoMVC client, our next goal is to get it to actually
130+persist its data. In order to accomplish that we'll first have to spend some
131+time thinking about what our data actually looks like.
132+
133+There are two broad areas of our data model that we'll want to think about:
134+
135+1. What kind of data will represent our state, and
136+2. What kinds of actions we'll take to modify our state.
137+
138+After working through what we'll want to store and how we'll make changes to the
139+items in that store, we should then segue into how to represent our data as Hoon
140+types. The natural language description of our data model should lend itself to
141+a corresponding representation in Hoon, allowing the reader to mmediately ground
142+the Hoon in an understood domain.
143+
144+Through the course of discussing how to represent todos and the actions to take
145+upon them, the concepts of molds, standard library types and Hoon's type system
146+can be gently introduced.
147+
148+By the end of this lesson:
149+
150+- I know how to define my own structures.
151+- I know how to interpret the contents of my `/sur` directory.
152+- I have a basic understanding of Hoon's built-in types and structures.
153+- I know how to work with types in the Dojo.
154+
155+## Part 3: Taking action
156+
157+In the last lesson we defined our data model and the actions that will be taken
158+upon it. In this lesson we'll extend our original gall agent to be aware of our
159+data model.
160+
161+First, we'll cover the concept of a `poke` by handling the actions we defined in
162+the previous lesson. Along the way we'll need to set up our agent's state using
163+the types we defined previously. This portion will be an ideal time to introduce
164+the way a running agent can be poked from the dojo.
165+
166+After using `~&` to print our state upon various actions for a while, we'll
167+demonstrate the purpose of `scry` and extend our agent's `on-peek` arm to expose
168+ways of reading our state through direct, explicitly written scrys.
169+
170+By the end of this lesson:
171+
172+- I know how my application store its state.
173+- I know how to modify my application's state.
174+- I know how what a `poke` is, what it's for, and how to respond to one.
175+- I can poke my agent from the dojo.
176+- I know what `scry` is.
177+- I know how to expose scry paths in `on-peek`.
178+- I can `scry` my agent.
179+
180+## Part 4: Client Integration
181+
182+There's a lot to cover in this section, so it'll probably be best to break it up
183+into multiple sections. When integrating with a client we need to take care of
184+writing to our urbit and receiving data from it when things change, which means
185+we need to understand a) how to work with JSON data coming and going from our
186+ship to the browser, b) the architecture of how Urbit interacts with the outside
187+world over HTTP, and c) how to combine this knowledge into a React application.
188+
189+### Part 4a: Working with JSON in Hoon
190+
191+Most of the outside world speaks in JSON, which means that our Urbit, at least
192+for now, also needs to understand how to parse and serialize its data into this
193+structure.
194+
195+Parsing JSON in JavaScript is fairly straightforward, because JS is dynamically
196+typed; Hoon however, is statically typed, which makes our task a bit more
197+challenging.
198+
199+This guide should cover the process of both parsing JSON into Hoon data
200+structures and going the other way; turning Hoon data structures back into JSON
201+for sending to a client.
202+
203+By the end of this lesson:
204+
205+- I understand how to parse JSON in Hoon.
206+- I understand how to serialize Hoon into JSON.
207+- I understand how Hoon's type system relates to JSON parsing.
208+
209+### Part 4b: Client-server architecture & subscriptions
210+
211+Urbit makes heavy use of [Command Query Responsibility
212+Segregation](https://www.martinfowler.com/bliki/CQRS.html), or CQRS, which means
213+that our application can either issue *commands* or *queries*, but not both
214+simultaneously. This is contrasted with the more common Create Read Update
215+Delete (CRUD) model, in which our client is performing more direct manipulation
216+of records in a datastore. In Urbit, CQRS is paired with an [Event
217+Sourcing](https://www.martinfowler.com/eaaDev/EventSourcing.html) approach,
218+which means that our model for receiving information on the client is as a
219+stream of events.
220+
221+In a CRUD-style model, a Todo client would work as follows:
222+
223+1. Client queries (Read) for all todos to load into the page.
224+2. Client creates (Create) a new todo, which produces a response with the new
225+ todo.
226+3. The returned todo is added to the list.
227+
228+To contrast that with a CQRS + Event Sourcing model, we'd have the following:
229+
230+1. Client queries for all todos to load into the page.
231+2. Client sets up a subscription to receive any new todos that are created as
232+ events.
233+3. Client issues a command to create a new todo, which produces *no response,*
234+ since these responsibilities are separated.
235+4. After the new todo is created by the server, it emits an event which is
236+ picked up by the subscription in step (2), which is then added to the list.
237+
238+In practice, step (1) above is actually unnecessary, because the subscription in
239+step (2) can be configured to produce all todos as an initial event upon
240+instantiation.
241+
242+This pattern is implemented in Urbit with `poke`, `scry`, (covered in the last
243+section) and `watch`. A `poke` is our terminology for a command, a `scry` is for
244+querying, and `watch` is for subscribing to updates to our data when they
245+happen. We've already seen commands (`poke` and queries (`scry`), but
246+subscriptions (`watch`) are new, and much more commonly used than queries for
247+the same reason as our query above could be eliminated.
248+
249+Most web developers are much more familiar with the CRUD approach than they are
250+with the model that Urbit uses, so it's worth explaining why this more complex
251+approach is employed.
252+
253+The answer becomes clear when you consider Urbit's primary purpose, which is for
254+building distributed systems. In a distributed system, each agent is interacting
255+with many others through message passing. Imagine a chat application, in which
256+many agents are sending messages at once: creating a message and then adding the
257+returned message into your UI would work for messages *you* send, but would miss
258+any messages sent to you by other agents. In Urbit's approach, messages sent by
259+other agents are no different than those sent by your agent, meaning the same
260+implementation that handles one agent also handles *n* other agents.
261+
262+After explaining the rationale behind the approach, we'll want to demonstrate
263+how to extend `on-watch` to expose our todos, how to publish events to
264+subscribers, and how to get those events to a client. This lesson should focus
265+on making the mechanics of getting information from client to server and back
266+again clear--actually wiring up the TodoMVC frontend can wait until the next
267+lesson.
268+
269+By the end of this section:
270+
271+- I understand why a client sets up subscriptions instead of receiving direct
272+ data responses.
273+- I know how to expose data to subscribers via `on-watch`.
274+- I know how to publish state changes to subscribers.
275+- I understand how data travels from my client to my ship.
276+- I understand how data travels from my ship to my client.
277+
278+## Part 5: Collaboration
279+
280+The final phase of this guide should demonstrate the ways in which applications built on Urbit can communicate with one another. TodoMVC has no built-in interface mechanic for this, so you'll have to be a bit creative and think through what "multiplayer mode" looks like for TodoMVC. It's okay for this to be fairly simple, as our goal is to demonstrate how to extend an agent to work with others—not to build a great collaborative todo list.
281+
282+It's likely (and desirable) that the addition of this feature introduces the need to update our data model to handle todo lists belonging to multiple different ships (since before we were only dealing with our own todos). That makes this an ideal time to demonstrate how to upgrade our application's state to a new version, as one would do in the real-world with a major feature addition.
283+
284+By the end of this section:
285+
286+- I understand how to set up a subscription on a foreign ship.
287+- I understand how to tear down subscriptions.
288+- I understand how to store and represent data belonging to multiple ships.
289+- I understand how to upgrade my application's state.
290+
291+
292+## Deliverables
293+Your solution to this bounty should include:
294+
295+* A standalone repository with gall agent(s) that demonstrate each working part.
296+* A pull request against the [urbit/docs](https://github.com/urbit/docs) repository that adds guided tutorials for each section.
297+
298+## Expectations
299+
300+You will work closely with the director of urbit.org on this project. This means that regular check-in calls will be held to discuss the project's progress. Additionally, the you are expected to provide regular status updates on the project to the Urbit community via twice-monthly updates on this bounty.
301+
302+The director will ensure that you have access to the necessary resources to complete this project. All prior work done on this project will be explained and made available to you, and should questions arise that require the expertise of engineers at Tlon, time will be made (schedules permitting) for your questions to be answered either in writing or over a call.
303+
304+## Milestones
305+
306+
307+### Part 1: Serving Static Content
308+2 stars
309+Sample code and guide are completed and ready for merge against urbit/docs.
310+
311+
312+### Part 2: Data Modeling
313+1 stars
314+Sample code and guide are completed and ready for merge against urbit/docs.
315+
316+
317+### Part 3: Taking Action
318+1 stars
319+Sample code and guide are completed and ready for merge against urbit/docs.
320+
321+
322+### Part 4: Client Integration
323+3 stars
324+Sample code and guide are completed and ready for merge against urbit/docs.
325+
326+
327+### Part 5: Collaboration
328+3 stars
329+Sample code and guide are completed and ready for merge against urbit/docs.
330+
331+
content/grants/escape.mdnew file+46
@@ -0,0 +1,46 @@
1++++
2+title = "Escape"
3+date = 2019-12-04
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "A reputation agent for Stars."
10+reward = 4
11+assignee = "yosoyubik"
12+id = "1146667285"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+"How much *Escape* does `~marzod` have?"
19+
20+When a planet is newly booted into the Urbit Network there is a fundamental service that its sponsor needs to provide: peer discovery. In order to do this the sponsor needs to be up and running, with a stable internet connection. The Urbit Network is still young but there has been several instances where planets discovered that, right after a first boot, they can't communicate with anybody in the network due to their sponsor not been active.
21+
22+These planets need to quickly escape, that is, leave their sponsor star and find a new one that provides a good service. A simple way to assess the likelihood of the sponsor being a good actor in the network is to look at on-chain data from the Azimuth contract, in particular, *Escapes*. If a sponsor has a low Escape score (planets that leave), one could use this as a proxy and say that the sponsor will keep behaving in the same way as the past data indicates. More over, if a planet attracts more planets, that signals more strongly the good quality of the provided service.
23+
24+This proposal addresses this problem by using the Beta Reputation to create a Landscape app that will show the score of a planet's sponsor based on data from Azimuth, in particular the number of planets spawned, and the number of planets that have escaped. [The Beta Reputation](https://www.csee.umbc.edu/~msmith27/readings/public/josang-2002a.pdf) uses the Beta Distribution to calculate the score (e.g. successful/unsuccessful events over the total number of interactions) as the expected value of a probability distribution. More data available (high number of booted planets) will narrow down the confidence of the probability (if a star has only booted a planet that didn't escape, the confidence of that score `(1-0.67=33%)` is smaller than the one of a star that has booted 200 planets and only two have escaped `(1-0.87=13%)`)
25+
26+A full reputation system for stars is out of scope for this proposal, but some ideas would be to include network uptime or other, more subjective metrics, ideally agreed by the children of each star.
27+
28+The aim of this proposal is not to create a perfect reputation system but rather, to introduce in the minds of the users that there is a sponsor that they need to pay attention to, that is providing a service, not only to them but to others in the network, and that the likelihood of that operator's behavior can be attested since the data is publicly available and in a blockchain.
29+
30+The Beta Reputation is a system that is very easy to understand to non-technical users but has a statistical background behind it. Nevertheless this is just one of the many reputation systems that are out there like [Regret](https://dl.acm.org/doi/pdf/10.1145/375735.376110), [Fire](https://eprints.soton.ac.uk/259559/1/dong-ecai2004.pdf) or [Travos](https://idp.springer.com/authorize/casa?redirect_uri=https://link.springer.com/content/pdf/10.1007/s10458-006-5952-x.pdf&casa_token=M38itGxqsu0AAAAA:lAUgQUvbc4dZFhrNs4SSPWrQ9PzUj05pzmU5zkvPkytDOfgFOIxVP0a8Tzk_VkRi37J1bRHPJ2IhTD8C). I envision this work as a starting point for introducing reputation systems in Urbit as libraries that can be used by the community for experimentation.
31+
32+With this is mind the Beta library (`/lib/beta.hoon`) can be used with any app that has a well defined data structure that comprises a list of timestamped events with a certain score, weighted, if desired, for a specific dimension. The ability to tag each event with a weighted dimension allows for complex reputations where different data points can be aggregated together.
33+
34+## Milestones
35+
36+
37+### Gall Agent and Beta Reputation Library
38+2 stars
39+Delivery of the agent and library for the Beta reputation that's able to poke Azimuth for the Blockchain data, calculate the reputation score, and store it on the agent.
40+
41+
42+### Escape UI
43+2 stars
44+Delivery of the UI interface that will show the Reputation Score to the user, with the ability to search for specific sponsors and filter the results accordingly.
45+
46+
content/grants/ethereum-abi-parser.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Ethereum ABI Parser"
3+date = 2020-03-10
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Create a Gall app that takes the bytecode for a contract ABI."
10+reward = 2
11+assignee = "xiphiness"
12+id = "1241532070"
13+completed = false
14+link = ""
15++++
16+
17+### Background
18+
19+The Contract Application Binary Interface (ABI) is the standard way to interact with contracts in the Ethereum ecosystem, both from outside the blockchain and for contract-to-contract interaction. Data is encoded according to its type, as described in this specification. The encoding is not self-describing and thus requires a schema in order to decode.
20+
21+###Bounty Description
22+
23+Create a Gall app that can output the byte code for a contract ABI.
24+
25+#### Gall application:
26+
27+- Parse ABI into valid byte code
28+
29+##### User interface:
30+
31+- Allow for a user to upload arbitrary ABI
32+- Create a form field based on the ABI
33+- Parse user input into appropriate data types
34+- Return bytecode
35+
36+### Resources:
37+
38+- [ABI Spec](https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html)
39+
40+### Contribution Guidelines:
41+- Do not begin work until your request to claim this bounty is accepted.
42+- Email your work to grants@urbit.org.
43+- Submit your work as a pull request on to the [urbit/urbit github repository](https://github.com/urbit/urbit).
44+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
45+- You have 90 days from the time of approval to complete this bounty.
46+
47+
48+## Milestones
49+
50+
51+### PR is merged
52+2 stars
53+Your code is accepted and merged.
54+
55+
content/grants/gall-api-documentation.mdnew file+54
@@ -0,0 +1,54 @@
1++++
2+title = "Gall API documentation"
3+date = 2019-07-22
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Write reference documentation for using the API for developing Gall apps."
10+reward = 1
11+assignee = "Liam Fitzgerald, borlyt-salnus"
12+id = "1251133389"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+
19+Gall is the Arvo kernel module that controls userspace applications. Understanding its API is required for developing applications on Arvo.
20+
21+#### Bounty Description
22+
23+Write a reference-style document that lists each arm name that could be used in a Gall app and describes what those arms are for. Each arm should also have a short example.
24+
25+Developers should be able to use this document as a template for writing their Gall app. Arms documented should include: `+poke`, `+coup`, `+peer`, `+reap`, `+quit`, `+peek`, `+prep`,`+scry`, and `+wake`.
26+
27+#### Resources
28+
29+* Read the existing [Gall documentation](https://urbit.org/docs/learn/arvo/gall/).
30+* Familiarize yourself with `gall.hoon`, which is in the `/sys/vane` directory.
31+* Familiarize yourself with the style of [reference documentation](https://urbit.org/docs/reference/).
32+
33+#### Contribution Guidelines
34+
35+* You have 30 days from the time of approval to complete this bounty.
36+* Do not begin work until your request to claim this bounty is accepted.
37+* Your document should be written in Markdown.
38+* Submit your document in the form of a pull-request to the [Docs repo](https://github.com/urbit/docs). This file should live under the reference directory.
39+* Expect to receive requests for changes to your document.
40+
41+
42+## Milestones
43+
44+
45+### First draft is submitted
46+0 stars
47+Your first draft is submitted as a pull request to the Docs repository.
48+
49+
50+### Final draft is merged
51+1 stars
52+Your edits are satisfactory, and your PR is merged to master.
53+
54+
content/grants/gifts/_index.mdnew file+4
@@ -0,0 +1,4 @@
1++++
2+title = "Gifts"
3+template = "grant_type/gifts.html"
4++++
content/grants/go-airlock-library.mdnew file+45
@@ -0,0 +1,45 @@
1++++
2+title = "Go Airlock Library"
3+date = 2020-06-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Create a library for the Go language to be used for Airlock, the protocols for interfacing with Urbit."
10+reward = 3
11+assignee = "Caio"
12+id = "764093285"
13+completed = true
14+link = ""
15++++
16+
17+Create an Airlock library for the Go (aka Golang) programming language. Airlock is the set of HTTP APIs for communicating with an Urbit. This bounty will involve creating a Go library wrapper for the server side event and HTTP API.
18+
19+Additionally, write a one-page explanation for the design choices for this library in the readme. If you have ideas for what Urbit applications would be useful for this library, please also include those suggestions in the readme.
20+
21+### Resources:
22+
23+- https://github.com/urbit/urbit/blob/master/pkg/arvo/sys/vane/eyre.hoon#L493
24+- https://github.com/baudtack/urlock-py
25+- [UrlockPy as an example of an Airlock integration](https://github.com/urbit/docs/pull/892)
26+
27+
28+###Contribution Guidelines:
29+
30+-Do not begin work until your request to claim this bounty is accepted.
31+- Submit your work as a separate github repo, and include a link to it in your submission. Email grants@urbit.org if you have trouble.
32+- Your library should be uploaded and available in a format compatible with the package manager you feel most comfortable maintaining.
33+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
34+- You have 90 days from the time of approval to complete this bounty.
35+- Successful completion of this bounty may result in an invitation to complete other Airlock library bounties. If you are interested in creating an Airlock library for a language other than the ones currently presented, please contact us at grants@urbit.org ; it’s likely we’ll approve this as a proposal.
36+
37+
38+## Milestones
39+
40+
41+### Work is finished
42+3 stars
43+You have completed your work and pushed it to a Github repo.
44+
45+
content/grants/graph-store-documentation-guide.mdnew file+100
@@ -0,0 +1,100 @@
1++++
2+title = "Graph Store Documentation Guide"
3+date = 2021-02-13
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Explainer, tutorial, and cookbook for `graph-store`"
10+reward = 4
11+assignee = "~sipfyn-pidmex"
12+id = "1888977136"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+Motivation: `graph-store` is an extremely well-designed and powerful system for creating social and business applications, that should unlock myriad novel applications on Urbit. Unfortunately, it is currently nearly completely unused outside of Tlon, mainly due to inadequate documentation materials.
19+
20+This project will change that, by fully familiarizing developers with `graph-store` and how to build software using it, and by providing a reference assist during subsequent development process.
21+
22+Every aspect of `graph-store` will be covered: designing schemas, interacting with them inside the CLI or from Urbit apps, and accessing them from frontends.
23+
24+## Scope & Intended Audience
25+### Scope
26+The target audience is an experienced developer in any outside programming language. We assume Hoon knowledge, and refer recommended hoon resources whenever necessary, covering the bare minimum in-line.
27+
28+We cover the process involved in creating a new social app from scratch. We do not cover interacting with `graph-store` on the server-side, i.e. from other `gall` agents, although we may refer to several outside examples of that, since they should be comprehensible to the user after working through this.
29+
30+### Audience 1: Developers Learning `graph-store`
31+The explainer and tutorial below are intended for learners, users who want to build a strong mental model of the store from scratch. They should be doable in either order (to accommodate different learning styles)
32+
33+### Audience 2: Developers Working on Social Applications
34+The cookbook/how-to and API reference are for developers who understand `graph-store` and need reference materials for common patterns and syntax while building applications.
35+
36+## Sections
37+### Explainer
38+
39+This includes a high-level description of what `graph-store` is and why it exists, a technical overview of `graph-store`, and a walkthrough of the implementations of the Chat and Publish apps and how they are built using `graph-store`.
40+
41+Includes explanations of:
42+* full walkthrough of `graph-store` and `post` sur files
43+* how the indexes work
44+* how validation marks are used in the code to enforce schemas
45+* scry examples
46+* how mutations to `graph-store` happen
47+* how the frontend queries, receives updates from, and sends messages to the backend
48+* where JSON parsing is used and for what
49+* key differences in schema design for Chat vs Publish
50+* what would be needed to extend Chat and Publish in various ways
51+
52+### Tutorial
53+* implementation of a simplified chan-style imageboard
54+* demonstrates threading and basic pagination
55+* simple `graph-store` reference embedding
56+
57+### Cookbooks
58+* common social data patterns, and how to do each one
59+* how to make a schema
60+* poking from the frontend
61+* updating graph nodes
62+* deleting & archiving graphs
63+* querying data from any graph
64+* embedding references to other graph content
65+* simple algorithms to rank results, a la HN/Reddit
66+
67+### Reference
68+Update https://urbit.org/docs/tutorials/hoon/graph/ to be more useful:
69+* links to relevant source files
70+* exact scrys available, with examples
71+
72+## User Stories
73+As a developer without prior `graph-store` knowledge, I can:
74+* Build a mental model of all aspects of the system with detailed explanations of actual production code
75+* Develop intuitions for how applications are built with it by designing and building my own social application
76+
77+As a developer who already understands `graph-store` I can:
78+* think of the pattern my social app will follow, and then refer to similar design how-tos to create my schema
79+* look up API information
80+* maintain existing `graph-store` applications on the backend
81+* maintain existing `graph-store` applications on the frontend in the frontend stack of my choice
82+
83+## Milestones
84+
85+
86+### Explainer
87+1 stars
88+Full written explainer posted online
89+
90+
91+### Tutorial
92+1 stars
93+Full written tutorial with tested code samples
94+
95+
96+### Cookbooks & Reference, Finalization
97+2 stars
98+Full written cookbook document, updated reference, and finalization of the content
99+
100+
content/grants/haskell-airlock-library.mdnew file+45
@@ -0,0 +1,45 @@
1++++
2+title = "Haskell Airlock Library"
3+date = 2020-06-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Create a library for the Haskell language to be used for Airlock, the API suite for outside communication with Urbit."
10+reward = 3
11+assignee = "bsima"
12+id = "688875191"
13+completed = true
14+link = ""
15++++
16+
17+Create an Airlock library for the Haskell programming language. Airlock is the set of HTTP APIs for communicating with an Urbit. This bounty will involve creating a Haskell library wrapper for the server side event and HTTP API.
18+
19+Additionally, write a one-page explanation for the design choices for this library in the readme. If you have ideas for what Urbit applications would be useful for this library, please also include those suggestions in the readme.
20+
21+### Resources:
22+
23+- https://github.com/urbit/urbit/blob/master/pkg/arvo/sys/vane/eyre.hoon#L493
24+- https://github.com/baudtack/urlock-py
25+- [UrlockPy as an example of an Airlock integration](https://github.com/urbit/docs/pull/892)
26+
27+
28+### Contribution Guidelines:
29+
30+- Do not begin work until your request to claim this bounty is accepted.
31+- Submit your work as a separate github repo, and include a link to it in your submission. Email grants@urbit.org if you have trouble.
32+- Your library should be uploaded and available in a format compatible with the package manager you feel most comfortable maintaining.
33+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
34+- You have 90 days from the time of approval to complete this bounty.
35+- Successful completion of this bounty may result in an invitation to complete other Airlock library bounties. If you are interested in creating an Airlock library for a language other than the ones currently presented, please contact us at grants@urbit.org ; it’s likely we’ll approve this as a proposal.
36+
37+
38+## Milestones
39+
40+
41+### Your work is finished
42+3 stars
43+You have completed your work and pushed it to a Github repo.
44+
45+
content/grants/hoon-001-learner-efficiency-and-early-learner-resources.mdnew file+81
@@ -0,0 +1,81 @@
1++++
2+title = "Hoon 001: Learner efficiency and early-learner resources"
3+date = 2020-02-10
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Create Hoon learning resources catered to learner efficiency, with orienting materials for Hoon & coding, learning examples, videos."
10+reward = 3
11+assignee = "som, ~risruc-habteb, ~rabsef-bicrym"
12+id = "471015542"
13+completed = true
14+link = ""
15++++
16+
17+Hoon 001: A focus on learner experience efficiency and early-learner resources
18+
19+(please note a full-format PDF of this proposal has been provided to Erik Newton)
20+
21+Introduction
22+
23+The problem:
24+
25+We perceive a need for an onboarding/educational experience into Hoon which is particularly tailored to the individual who has little to no experience coding, or for the individual who has a serious interest in learning and using Hoon, but has a heightened need for the educational efficiency (i.e. as much learning possible per amount of time and brainpower spent). This comment, and indeed this project proposal is in no way a dig on the current Tlon educational efforts. In fact, we would like to state outright that the current resources represent a solid work effort and are extraordinarily useful for many types of learners.
26+
27+For these two groups mentioned above, Hoon presents particular learning challenges, including:
28+
29+Extensive and new vocabulary, with no clear distinction between which terms map to general computer science, which are Urbit/Hoon particular, and where the boundaries of definition lie in each case.
30+Sheer volume of new concepts for the beginning programmer, which, when presented at a pace faster than an efficient learning pace, might lead to confusion and less efficient learning.
31+It may be that the new coder or early learner has little mastery of similar concepts. References to introduce new concepts should make use of common prior knowledge, for example, by mapping comparisons to Excel, everyday thinking and, where necessary, mathematical functions.
32+In particular, the new student starts out “lost” by definition and requires many more references as to where one is, where one is going and what lies at the end of each lesson.
33+Additionally, they will benefit from larger-scope references as to where lessons fit into the landscape of Hoon mastery.
34+The non-coder or coder who is learning in order to realize a particular idea with Hoon code might not appreciate purely cerebral exercises. To keep peak interest and engagement, work products should be tangible and feel useful to cultivate enthusiasm to keep learning, even with basic material.
35+
36+Our solution:
37+
38+We aim to create a set of Hoon education modules that are specifically catered to people who have minimal to no coding skills. Our current working title is “Hoon 001.” We envision the product will be a textbook-esque website-based set of content. To achieve this as an excellent-quality & effective work product we plan to utilize the following elements:
39+
40+An appropriately high-level introduction to coding generally, and to Hoon specifically, focusing on the broadest concepts, which a learner should focus on understanding first
41+Definitions of terms which are not open-ended, and which as clearly as possible establish boundaries between what something is and is not and, where possible, include references to readily accessible external concepts
42+Visualization using color, white space and annotations to convey program flow and highlighting key points.
43+Pacing of new and abstract concepts, that is deliberate and steady, ordered as sequentially as possible, with a limited number of new concepts under focus per unit effort/time
44+Linear progression/accumulation of skill with a steady advancement of themes, concepts, knowledge
45+Consistent teaching methodology - Break down complex programs into readily intelligible sections (thereby aiding the user in understanding how the interpreter ‘thinks’), discuss tools required to program these subsections, walk line by line through the resultant code and finally explain how the work can be stitched together to form the complete program.
46+Multi-sensory learning experience - The use of multiple tools to cater to different learning styles, such as text-based walkthrough, annotations (as already indicated) and a video walkthrough for each generator analyzed.
47+
48+
49+Proposed work product/deliverable:
50+
51+We will deliver web page appropriate content format that includes:
52+Introduction to coding in general for the non-coder
53+Why code?
54+Introduction to concepts in programming
55+Assumptions about their skillset (the interface with computers, are quite familiar with Excel, and know some basic skills about working with Unix terminals, have set up a ship that is running and spawned a moon to use for coding - with links to such information in case they do not)
56+Some basics: what is a program, what is computer naivety, how-to programs begin and end
57+A clear description of goals: preemptively answering “what will we learn here?”
58+A few of Hoon’s challenges for the new learner, in-depth and in plain English
59+Auras
60+Types of values
61+Cells
62+Discreteness (the importance of considering data, whenever presented, down to the atom level, as well as the idea that, in subject-oriented programming, given that everything is part of the subject, it is increasing (a) difficult and (b) necessary to exactingly specify 'on what' your program intends to operate)
63+How Hoon programs terminate
64+Two of the types of Hoon programs
65+The naked generator
66+The say generator
67+Some tools we will need (some runes explained)
68+Let’s create! Five generators, from fairly trivial (1-2) to stretching the learner’s skill set with each next generator project. Tasks presented, breaking down the task to what conceptual tools are needed, to going through the code line by line and character by character, again in-depth and in plain English to explain how those elements are written in Hoon and how the computer manages it
69+
70+
71+Expected hours: 125
72+
73+
74+## Milestones
75+
76+
77+### Full Project
78+3 stars
79+Full project delivery, including content, learning materials, generators, walkthroughs, video walkthroughs
80+
81+
content/grants/host-three-college-university-urbit-meetups-1.mdnew file+60
@@ -0,0 +1,60 @@
1++++
2+title = "Host Three College/University Urbit Meetups (1)"
3+date = 2020-03-02
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Hold a meetup and presentation about Urbit."
10+reward = 1
11+assignee = "P. Paramo"
12+id = "901396717"
13+completed = false
14+link = ""
15++++
16+
17+### Background
18+
19+Urbit is a canvas for learning, building, experiments and collaboration. We believe this makes it a natural fit for students and teachers of many disciplines. We encourage faculty, staff, and students at any college or university to conduct meetups to explain Urbit and help new users join.
20+
21+### Bounty Description
22+
23+This bounty is to host an Urbit meetup at your college/university. The meetup should meet the following criteria:
24+- The meetup must be open to all students and faculty, and there must be a public web link for joining (like meetup.com)
25+- You do not need to be a Computer Science student, but we request that you specifically make sure to invite and notify the CS department at your school about the meetups.
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least three meetups.
30+
31+Presentations don't have to be technical, but consider some of these topics to choose from for technical talks:
32+- Nock (Virtual Machines)
33+- Kelvin versioning
34+- Deterministic computing
35+- Binary tree data structures
36+- Azimuth (Urbit identities)
37+- The Ames protocol
38+
39+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your university’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
40+
41+### Resources
42+
43+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
44+
45+### Contribution Guidelines
46+
47+- Do not begin work until your request to claim this bounty is accepted.
48+- When applying to work on the bounty, tell us a little about yourself and mention which university and location you'd be hosting the meetups in.
49+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
50+- You have 100 days from the time of approval to complete this bounty.
51+
52+
53+## Milestones
54+
55+
56+### Three meetups are held
57+1 stars
58+Your three meetups are held, and links to the presentations have been posted and sent to grants@urbit.org.
59+
60+
content/grants/host-three-college-university-urbit-meetups-2.mdnew file+60
@@ -0,0 +1,60 @@
1++++
2+title = "Host Three College/University Urbit Meetups (2)"
3+date = 2020-03-03
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Hold a meetup and presentation about Urbit."
10+reward = 1
11+assignee = "kirk-hutchison"
12+id = "167729270"
13+completed = false
14+link = ""
15++++
16+
17+### Background
18+
19+Urbit is a canvas for learning, building, experiments and collaboration. We believe this makes it a natural fit for students and teachers of many disciplines. We encourage faculty, staff, and students at any college or university to conduct meetups to explain Urbit and help new users join.
20+
21+### Bounty Description
22+
23+This bounty is to host an Urbit meetup at your college/university. The meetup should meet the following criteria:
24+- The meetup must be open to all students and faculty, and there must be a public web link for joining (like meetup.com)
25+- You do not need to be a Computer Science student, but we request that you specifically make sure to invite and notify the CS department at your school about the meetups.
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least three meetups.
30+
31+Presentations don't have to be technical, but consider some of these topics to choose from for technical talks:
32+- Nock (Virtual Machines)
33+- Kelvin versioning
34+- Deterministic computing
35+- Binary tree data structures
36+- Azimuth (Urbit identities)
37+- The Ames protocol
38+
39+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your university’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
40+
41+### Resources
42+
43+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
44+
45+### Contribution Guidelines
46+
47+- Do not begin work until your request to claim this bounty is accepted.
48+- When applying to work on the bounty, tell us a little about yourself and mention which university and location you'd be hosting the meetups in.
49+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
50+- You have 100 days from the time of approval to complete this bounty.
51+
52+
53+## Milestones
54+
55+
56+### Three meetups are held
57+1 stars
58+Your three meetups are held, and links to the presentations have been posted and sent to grants@urbit.org.
59+
60+
content/grants/host-three-college-university-urbit-meetups-3.mdnew file+59
@@ -0,0 +1,59 @@
1++++
2+title = "Host Three College/University Urbit Meetups (3)"
3+date = 2020-03-03
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Hold a meetup and presentation about Urbit."
10+reward = 1
11+assignee = "~sanlyt-modbyt"
12+id = "372504274"
13+completed = false
14+link = ""
15++++
16+
17+### Background
18+
19+Urbit is a canvas for learning, building, experiments and collaboration. We believe this makes it a natural fit for students and teachers of many disciplines. We encourage faculty, staff, and students at any college or university to conduct meetups to explain Urbit and help new users join.
20+
21+### Bounty Description
22+
23+This bounty is to host an Urbit meetup at your college/university. The meetup should meet the following criteria:
24+- The meetup must be open to all students and faculty, and there must be a public web link for joining (like meetup.com)
25+- You do not need to be a Computer Science student, but we request that you specifically make sure to invite and notify the CS department at your school about the meetups.
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least three meetups.
30+
31+Presentations don't have to be technical, but consider some of these topics to choose from for technical talks:
32+- Nock (Virtual Machines)
33+- Kelvin versioning
34+- Deterministic computing
35+- Binary tree data structures
36+- Azimuth (Urbit identities)
37+- The Ames protocol
38+
39+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your university’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
40+
41+### Resources
42+
43+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
44+
45+### Contribution Guidelines
46+
47+- Do not begin work until your request to claim this bounty is accepted.
48+- When applying to work on the bounty, tell us a little about yourself and mention which university and location you'd be hosting the meetups in.
49+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
50+- You have 100 days from the time of approval to complete this bounty.
51+
52+## Milestones
53+
54+
55+### Three meetups are held
56+1 stars
57+Your three meetups are held, and links to the presentations have been posted and sent to grants@urbit.org.
58+
59+
content/grants/host-three-virtual-urbit-meetups.mdnew file+51
@@ -0,0 +1,51 @@
1++++
2+title = "Host Three Virtual Urbit Meetups"
3+date = 2020-03-27
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
10+reward = 1
11+assignee = "~naltyc-wornes (dasfeb.industries)"
12+id = "542719422"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+It's the time of the Coronavirus, and so everyone is switching to meeting online. Urbit meetups can do this, too! This bounty is to host an Urbit meetup virtually. The meetup should meet the following criteria:
24+
25+- The meetup must be publicly joinable, and there must be a public web link for signing up (like meetup.com)
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least three virtual meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of a participatory online Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+
39+- Do not begin work until your request to claim this bounty is accepted.
40+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
41+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
42+- You have 100 days from the time of approval to complete this bounty.
43+
44+## Milestones
45+
46+
47+### The third meetup is help
48+1 stars
49+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
50+
51+
content/grants/host-two-urbit-meetups-1.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (1)"
3+date = 2019-11-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "sitful-hatred"
12+id = "2020814292"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-10.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (10)"
3+date = 2019-11-26
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
10+reward = 1
11+assignee = "jpt4"
12+id = "278361497"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com)
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is help
47+0 stars
48+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is help
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-11.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (11)"
3+date = 2021-02-07
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word."
10+reward = 1
11+assignee = "Thomas"
12+id = "1314014268"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Urbit needs champions! The Urbit Foundation is looking for community members to host local or online meetups to spread the word.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com)
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city's Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-2.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (2)"
3+date = 2019-11-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "Matthew Levan, nforbes6"
12+id = "1252614745"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-3.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (3)"
3+date = 2019-11-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "yosoyubik"
12+id = "1574784178"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The first meetup is held
52+1 stars
53+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-4.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (4)"
3+date = 2019-11-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "~forfel-norfel"
12+id = "1872089827"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-5.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (5)"
3+date = 2019-11-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "NHL"
12+id = "180695644"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-6.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (6)"
3+date = 2019-11-21
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "~dilled-fastyd"
12+id = "675590864"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check it out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-7.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (7)"
3+date = 2019-11-21
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Host two Urbit meetups in your city."
10+reward = 1
11+assignee = "nrhtr, ~hocdep-labtel, sunmaid, jackw"
12+id = "1098941980"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-8.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (8)"
3+date = 2019-11-22
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
10+reward = 1
11+assignee = "~winter-paches, ~fonnyx-nopmer"
12+id = "1740918704"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com)
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@urbit.org.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is held
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is held
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/host-two-urbit-meetups-9.mdnew file+55
@@ -0,0 +1,55 @@
1++++
2+title = "Host Two Urbit Meetups (9)"
3+date = 2019-11-26
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing."
10+reward = 1
11+assignee = "juaningan"
12+id = "1128452733"
13+completed = false
14+link = ""
15++++
16+
17+#### Background
18+
19+Tlon is not Urbit; Urbit is owned by its community. So we want to decenter the Urbit brand into cities outside of San Francisco, and watch the community’s independent visions of the project take wing.
20+
21+#### Bounty Description
22+
23+This bounty is to host an Urbit meetup in your city. The meetup should meet the following criteria:
24+
25+- The meetup must be public, and there must be a public web link for joining (like meetup.com)
26+- The meetup must have a presentation or talk about Urbit.
27+- The presentation or talk must be recorded and posted publicly online.
28+- You must promote the event vigorously; social media, a website, etc. Email support@urbit.org if you want a signal boost.
29+- You must host at least two meetups.
30+
31+You should go into this bounty with the mindset of creating a regularly scheduled meetup, one that might become the nucleus of your city’s Urbit community. Also, email support@tlon.io once you've hosted a meetup, and we will add you to your [list of active meetups](https://urbit.org/community/meetups/)!
32+
33+#### Resources
34+
35+Check out our [guide](https://urbit.org/community/hosting-a-meetup/) to best practices for Urbit meetups.
36+
37+#### Contribution Guidelines
38+- Do not begin work until your request to claim this bounty is accepted.
39+- When applying to work on the bounty, tell us a little about yourself and mention which city you'd be hosting the meetups in.
40+- Proof of the meetups happening will be determined by the recordings of the presentations. Email links to these recordings to grants@tlon.io.
41+- You have 100 days from the time of approval to complete this bounty.
42+
43+## Milestones
44+
45+
46+### The first meetup is help
47+0 stars
48+The first meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
49+
50+
51+### The second meetup is help
52+1 stars
53+The second meetup is held, and a recording of that meetup's talk or presentation is sent to grants@urbit.org.
54+
55+
content/grants/links-in-urbit-reference-docs.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Links in Urbit Reference Docs"
3+date = 2020-06-16
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Add links to our reference doc pages so that people can easily discover new concepts"
10+reward = 1
11+assignee = "alecbrick"
12+id = "45608361"
13+completed = false
14+link = ""
15++++
16+
17+The goal of this proposal is to add links to the Urbit Reference docs (that is, Hoon Expressions, Standard Library, and Vane APIs).
18+
19+Suppose you're browsing [section 2a](https://urbit.org/docs/reference/library/2a/) of the Hoon standard library. You see the word "unit" a bunch of times, but you're not actually sure what it means. You try to click on one of the instances, hoping it'll take you to a page with more information, but nothing happens! That's because the library (and a fair amount of Urbit documentation) lacks links between pages.
20+
21+Consider, for contrast, a [random Python doc page](https://docs.python.org/3/library/os.html). Every concept that has documentation has a link to said documentation. By adding links to the Urbit docs, we'll make the documentation easier to use, and from there make Hoon and Urbit easier to learn.
22+
23+## Milestones
24+
25+
26+### Links added to Reference documentation
27+1 stars
28+Concepts that refer to pages with documentation have links to said documentation.
29+
30+
content/grants/llelogram.mdnew file+56
@@ -0,0 +1,56 @@
1++++
2+title = "Llelogram"
3+date = 2020-07-29
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Towards creating a political-econometric of federal legislation people can read as easily as a stock ticker: Llelogram"
10+reward = 5
11+assignee = "Dotty"
12+id = "821310723"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+This is a grant proposal to build a Gall application, we are calling Llelogram*
19+
20+For the past few years we have been working on a legislative analysis tool we call Prism that interprets actionable legislation in federal congress and renders a basic, static typed value reflecting the partisan displacement of the text, then transposes that over roll call voting data. The inherent structure of Gall applications, with vases and cages seems for us an ideal way to take the concept one step deeper by creating an index of relevant factors to run contravariant to the state:(actionable legislation). Put another way, we want to be able to interpolate more complex factors like fiscal displacement and popular discourse into our data, creating a political-econometric. By translating the static displacement of partisan divergence into a material quantity through Prism rendering a typed value, we have been waiting to interpolate abstract textual facets of predeterminate factors (like the intellectual justifications of empirical affect) into a value dynamic enough to be logged cleanly and actionably. Needless to say, we are very excited about Gall.
21+ The concept of scoring legislation at all–let alone determining how divergent it may be–is somewhat controversial, however we believe that our process of scoring legislation is well developed yet simple enough to be conceptualized casually, to the point that is credible in the way that stock tickers are referenced to interpret market developments in real time. Ideally, Llelogram should take advantage of the Gall application structure to provide economic and philosophic context to active federal legislation in real time through logs of atomic transactions.
22+Nothing happens in a vacuum. For however complicated and impenetrable legislation can be, there are very clear and consistent textual markers that do translate into material displacement. The idea then, is to create a Gall application that renders an illustration* of this displacement so that we could easily conceptualize how legislation affects our society.
23+
24+Technically, Llelogram is a set of tables to run contravariant to legislation. Technically illiterate as I am, from what I could gather on the Urbit Gall App tutorial, the unary function would help to illustrate the fiscal dynamic, while the binary function would translate the more abstract philosophical displacement of the text. The unary table would be made up of contemporary econometrics having to do with wealth portfolios; i.e. income/tax[liabilities] across demographics such as public sector employees (eg. teachers and janitors)/elected representatives, to private sector employees/capitalists (eg. tycoons). The binary function would be comprised of diametrica that reflect the spectrum of modern* discourse/experience. The unary table is a little more straightforward in that it’s parameters are neatly class/quantified through a currency which is universally accepted/desired. On the other hand, the binary table would be something like a literary collage made up of seminal sociological texts spanning the entire spectrum of (actionable)pop discourse that resonates variably between partisan positions to illustrate displacement.
25+
26+2020 has been a scary year, but for all the sound and fury I can see light in our eyes. If we can create what I have been conceptualizing since 2015, Llelogram will be a tool for people to see how well legislation written in their names reflects the light in their eyes. Thank you so much for reading, I hope I can be part of utilizing Urbit and bringing it into the real world with you folks!
27+
28+
29+## Milestones
30+
31+
32+### Build the CLI
33+1 stars
34+At this point we should have a basic CLI that imports actionable* federal legislation, and provides a basic way for us to flag language/numbers and score it according to how generally displaced is.
35+
36+
37+### Compiling the tables
38+1 stars
39+Having worked in parallel with the engineers as they put together the CLI, I'll be compiling a basic list of tax liabilities issued by tax code; also a literary collage of seminal sociology
40+
41+
42+### Interpret the stimulus package
43+1 stars
44+Given the gravity of the stimulus package congress is working on, we should apply our project to it as a way of testing how well our agent illustrates the content and resonates with our control
45+
46+
47+### Write a paper
48+1 stars
49+The paper should stand as a kind of thesis which would be tested as the election happens and we can see how these developments were interpreted through the constituents.
50+
51+
52+### Create a kind of graphic rendition
53+1 stars
54+Given that the ultimate goal of Llelogram is to be something like a stock ticker, I want to create a coherent design language that would reflect the State we are managing.
55+
56+
content/grants/matrices-in-hoon.mdnew file+57
@@ -0,0 +1,57 @@
1++++
2+title = "Matrices in Hoon"
3+date = 2020-02-21
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Add array types to Hoon."
10+reward = 5
11+assignee = "N E Davis"
12+id = "611660914"
13+completed = false
14+link = ""
15++++
16+
17+### Background
18+
19+Hoon currently does not have vector or array types.
20+
21+### Bounty Description
22+
23+You must:
24+- Define a Hoon data structure for n-dimensional arrays
25+- Spec out Hoon type signatures for basic array functions, with an informal but coherent plan for jetting
26+- Implement basic array functions
27+- Write corresponding jets
28+
29+You approach could follow one of many paradigms, but below are some good ideas:
30+- BLAS-style matrix math
31+- Tensorflow
32+- Futhark
33+
34+Any paradigm is acceptable as long as it results in code whose performance is at least close to on-par with NumPy.
35+
36+### Resources
37+
38+- [The NumPy documentation](https://docs.scipy.org/doc/)
39+- [BLAS](http://www.netlib.org/blas/)
40+- [Tensorflow](https://www.tensorflow.org/js/guide/tensors_operations)
41+- [Futhark](https://futhark-lang.org/examples/arrays.html)
42+
43+### Contribution Guidelines
44+
45+- Do not begin work until your request to claim this bounty is accepted.
46+- Submit your code as a PR to the [urbit Github repo](https://github.com/urbit/urbit)
47+- You have 180 days from the time of approval to complete this bounty.
48+
49+
50+## Milestones
51+
52+
53+### Your PR is merged
54+5 stars
55+Your PR is accepted and merged.
56+
57+
content/grants/matrixriotim-bridge-bot.mdnew file+39
@@ -0,0 +1,39 @@
1++++
2+title = "Matrix(Riot.im) bridge/bot"
3+date = 2020-11-05
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "This would be a python bot to connect urbit to any Matrix server. It would act as a bridge, mirroring messages between the two platforms."
10+reward = 2
11+assignee = "modmes-livheb"
12+id = "1496457780"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+## How
19+Looking over the airlock documentation this seems to be a pretty simple endeavor. Preliminary testing shows it should be more than possible to connect a matrix server and urbit channel. Both systems have well built python based API's and transfer message's via a json query, very manipulation looks needed.
20+## Why
21+I'm currently apart of a group split between the two platforms, us Martians pushing for the new internet and the old souls resistant to change. Building something like this then open sourcing it for other groups experiencing similar issues could bring a entry point for plethora of future Martians.
22+## Stars
23+I'm a close friend of ~nartes-fasrum, a prominent member of the community. They've gotten me addicted to this new age internet and gave me the idea for this project. I'm seeking a single star to cement my place in the galaxy, helping grow the community. I've actively recruited people in the real world under ~sorwet on behalf of ~nart but would like to start sponsoring them myself. I'm an AWS certified engineer with a burning passion for bleeding edge tech, this is my newest and most burning passion. The second milestone is more of a stretch goal of mine, I'm not sure I'm able to complete that alone, but I think it would be a really nice addition to lower the entry bar for fellow martians.
24+
25+
26+
27+## Milestones
28+
29+
30+### Working base client
31+1 stars
32+At this point I'd like to have the base client working, subscribing and emitting messages between systems. I'd plan on this running via a separate cli-based client.
33+
34+
35+### Web Client
36+1 stars
37+A self hosted administration portal for the bot, able to add matrix channels/ships seamlessly. This is something that I'd like to complete but not sure on an ETA.
38+
39+
content/grants/minimal-urbit-os.mdnew file+56
@@ -0,0 +1,56 @@
1++++
2+title = "Minimal Urbit OS"
3+date = 2021-01-20
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "A Linux based host OS with only the essentials needed to run Urbit, designed to help the process of getting Urbit running on bare metal"
10+reward = 6
11+assignee = "~forfel-norfel"
12+id = "1935638429"
13+completed = false
14+link = ""
15++++
16+
17+This will be a minimal Linux-based operating system designed for running Urbit. It will include only components essential to keeping a ship running smoothly in a specific but reasonably obtainable x86 environment (UEFI, Ethernet with DHCP, generic Intel or VMware hardware, etc).
18+
19+It will be designed and built with the larger goal of identifying and isolating all functionality that is missing from Urbit so that those features can be added and Urbit will gradually move closer to running directly on hardware.
20+
21+This OS is intended to be a foundation for most of the different environments where people will want to run Urbit. It will be simple for future projects to combine this OS with an overlay that includes software specific to the target environment.
22+
23+Possible environments:
24+- local server
25+- single cloud server
26+- planet hosting provider
27+- laptop running Urbit with a native interface for Landscape
28+- one click Windows app that runs everything in WSL or a VM
29+
30+All management functionality that will be essential regardless of environment will be included and exposed through a basic API. This API will most likely be a command line program, and it will simplify tasks like breaching by combining multiple steps into a single, reliable command. While there are most likely existing scripts to handle some of these tasks, it will be necessary to adapt those processes to this new OS since some things will be missing or work differently.
31+
32+Qualifications: I recently installed Gentoo on a 20 year old ThinkPad for fun.
33+
34+## Milestones
35+
36+
37+### Proof of concept
38+1 stars
39+A minimal VM that supports booting and running a comet for several hours with a small amount of manual setup
40+
41+
42+### System architecture plan
43+1 stars
44+A diagram and written overview of all components and their dependencies, explaining how the system works and why those components were chosen. I will seek input from Tlon.
45+
46+
47+### Usable OS image
48+2 stars
49+A reasonably stable and complete OS image that testers can use for hosting their planets
50+
51+
52+### Documentation and fixes
53+2 stars
54+Documentation for the entire system and build process, including specs for each component and ideas for replacements within Urbit. The OS will be updated to address known problems.
55+
56+
content/grants/network-explorer-data-pipeline-http-api.mdnew file+229
@@ -0,0 +1,229 @@
1++++
2+title = "Network Explorer: Data Pipeline & HTTP API"
3+date = 2021-03-12
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Build a public, open HTTP API for exploring metrics about the Urbit network."
10+reward = 5
11+assignee = "Christopher King"
12+id = "1101665172"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+
19+![network explorer screenshot](https://wolref-podlex.s3.us-west-2.amazonaws.com/wolref-podlex/2021.2.23..20.58.30-Screen%20Shot%202021-02-23%20at%209%2C01%2C03%20AM.png)
20+
21+### Goal
22+
23+Build a public, open HTTP API for exploring metrics about the Urbit network.
24+
25+### Background
26+
27+The project known as the **Network Explorer** has been in the works at Tlon for
28+quite some time. The idea is to build a publicly-accessible tool (hosted on
29+https://network.urbit.org) that provides key metrics and insights into the state
30+of the Urbit network. A series of high-fidelity designs have been produced.
31+
32+### Scope
33+
34+This bounty covers the creation of the:
35+
36+- **data pipeline**: we're concerned with data from the PKI (Azimuth) and
37+ the Urbit network itself. These two datasets will need to be aggregated and
38+ indexed for efficient querying.
39+- **HTTP API**: the interface for querying data from a client, like the Network
40+ Explorer.
41+
42+The Network Explorer interface will be covered in a separate bounty.
43+
44+## Implementation
45+
46+### Data Model
47+
48+Let's start with the data model. There are two sources of data that we need:
49+
50+- **PKI (Azimuth)**: The public-key infrastructure, currently known as Azimuth,
51+ is our primary source of data. This information is currently found on Ethereum
52+- **Radar output**: [`radar`](https://github.com/urbit/urbit/blob/2c412d658a74dca3b3f584b92f8b390f38a05ba1/pkg/arvo/app/radar.hoon) is a program run from within an Urbit
53+ ship that pings (`|hi`) every Urbit ship and records the results. This data is exposed in a single JSON file that is added to over time as the script runs.
54+
55+Most of the required information in the Network Explorer will come from Azimuth.
56+It's important to know though that the source of PKI information will likely
57+change in the near future in light of [ongoing work to reduce the
58+cost](https://groups.google.com/a/urbit.org/g/dev/c/p6rP_WsxLS0) of bringing
59+nodes onto the network.
60+
61+The below [entity-relationship
62+diagram](https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model)
63+defines a data model in terms of a relational database:
64+
65+![erd diagram](https://wolref-podlex.s3.us-west-2.amazonaws.com/wolref-podlex/2021.2.23..20.58.39-Network%20Explorer%20ERD.png)
66+
67+Some notes about the above diagram:
68+
69+* The data model should be *agnostic to any particular PKI storage
70+ infrastructure* to future-proof it against PKI changes.
71+* For non-`ping` data, it should be possible to compute the table of `node` from
72+ a time-ordered traversal of `pki_event` (kind of like Arvo!). This means that
73+ many fields listed on the `node` table could instead be derived from analysis
74+ of the `pki_event` table. The implementer will be responsible for determining
75+ which fields should be represented on the `node` directly and which should be
76+ determined from `pki_event` for performance purposes.
77+* We don't have data for comets or moons, because they're not registered on
78+ Azimuth and `radar` only checks for activity from ships with keys that have
79+ been set on Azimuth. There will likely be a future in which we'll have a way
80+ to provide data about these ship types though.
81+
82+### Data Ingestion
83+
84+Data from Azimuth and `radar` will need to be regularly extracted, parsed, and
85+persisted to the local database for querying.
86+
87+For Azimuth, using a tool like [infura](https://infura.io) should be used.. Tlon
88+currently uses infura, so it should be possible to use a free account for
89+development and Tlon's pre-existing service in production.
90+
91+The output of the `radar` script is saved to a JSON file that can be found
92+[here](http://35.247.74.19:8080/~radar.json). This file is updated as new ping
93+information is obtained, so data ingestion from this service should happen on
94+some regular schedule.
95+
96+### API
97+
98+The following are are necessary API endpoints for the Network Explorer UI to
99+function properly. It's likely that some details have been missed, so apply your
100+own judgement when designing the API.
101+
102+This interface is meant to be agnostic to the API mechanism you choose, which
103+could be either REST or GraphQL.
104+
105+#### get-node
106+
107+Produce the details for a single node.
108+
109+**Parameters**
110+- `urbit_id`: `@p`
111+
112+**Returns**
113+- `urbit_id`: `@p`
114+- `node_type`: `#{galaxy,star,planet,moon,comet}`
115+- `status`: `#{locked,unlocked,spawned,activated,online}`
116+- `continuity`: `int`, current continuity
117+- `key_revision`: `int`, current revision of keys
118+- `num_owners`: `int`, number of owners
119+- `sponsors`: `[node]` (sponsor and sponsor's sponsor, if applicable)
120+- `kids`: `[node]` (nodes sponsored by this one)
121+- `proxy_addresses`:
122+ - `ownership`
123+ - `spawn`
124+ - `transfer`
125+ - `voting`
126+ - `management`
127+
128+#### get-nodes
129+
130+Produce a list of nodes, optionally with parameters. Absence of parameters queries all nodes.
131+
132+**Parameters**
133+- `q`: `string` (optional: query term to search for)
134+- `node_types`: `[node_type]` (optional: produce just events for specific node types)
135+- `limit`: `int` (number of results to return)
136+- `offset`: `int` (number of results to offset by)
137+
138+**Returns**
139+An array of `node` in ascending order by `point`.
140+
141+#### get-pki-events
142+
143+Produce the stream of PKI events for a specific Urbit ID, or globally in descending order of `time`.
144+
145+**Parameters**
146+- `urbit_id`: `@p` (optional: unspecified implies global)
147+- `since`: `timestamp` (optional: unspecified implies all events)
148+- `node_types`: `[node_type]` (optional: produce just events for specific node types)
149+- `limit`: `int` (number of results to return)
150+- `offset`: `int` (number of results to offset by**
151+
152+**Returns**
153+An array of `pki_event` in descending order of `time`.
154+
155+#### get-activity
156+
157+Produce the network activity of a node or nodes.
158+
159+**Parameters**
160+- `urbit_id`: `@p` (optional: specific ship to pull activity for)
161+- `since`: `timestamp` (optional: activity since provided time)
162+- `until`: `timestamp` (optional: activity up until the provided time)
163+
164+If `urbit_id` is unspecified, implies all ships.
165+
166+If `since` and `until` are unspecified, produces all activity for all time. If
167+only `since` is provided, produces activity from `since` to the present. If only
168+`until` is provided, produces activity for all of time up until `until`. If both
169+are provided, queries activity within a range.
170+
171+**Returns**
172+Array of:
173+- `urbit_id`: `@p`
174+- `date`: `date` (no time)
175+- `active`: `boolean` (active or inactive)
176+
177+### Technology Requirements/Guidelines
178+
179+That which is not explicitly specified here is up to the choice of the
180+implementer.
181+
182+* **Database**: PostgreSQL
183+* **Ethereum Interaction**: Infura
184+* **HTTP API methodology**: GraphQL or REST
185+* **ORM**: None. Implementer should be sufficiently familiar with SQL.
186+* **API Hosting**: The API will be hosted on `api.network.urbit.org` or
187+ `network.urbit.org/api`.
188+
189+## Requirements
190+
191+- 2+ years of experience with developing HTTP APIs
192+- 2+ years of experience working with relational databases
193+- Code hosted at https://github.com/urbit/network-api
194+- Attend regular (weekly or bi-weekly) checkin meetings with the director of
195+ urbit.org to provide status updates
196+
197+## Resources
198+
199+- A complete set of high-fidelity designs in Figma will be made available to the
200+ worker.
201+- The director of urbit.org will ensure access to other resources or personnel
202+ as needed.
203+
204+## Milestones
205+
206+
207+### Data ETL
208+2 stars
209+The database has been designed and data from both sources is ingested
210+(extracted, transformed and loaded) on a regular schedule. Analysis can be
211+performed at the database layer.
212+
213+
214+
215+### HTTP API
216+2 stars
217+An HTTP API is written per the above specification and deployed to
218+`https://api.network.urbit.org`.
219+
220+
221+
222+### UI Integration
223+1 stars
224+The Network Explorer UI will be a separate proposal, but integration with an
225+interface inevitably surfaces oversights in the original design. An additional
226+star will be awarded for providing ongoing maintenance as-needed during
227+front-end integration.
228+
229+
content/grants/open-street-maps-data-importation.mdnew file+53
@@ -0,0 +1,53 @@
1++++
2+title = "Open Street Maps Data Importation"
3+date = 2020-07-09
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "reate a mapping tool which allows Open Street Maps data to be imported into Urbit."
10+reward = 2
11+assignee = ""
12+id = "1072822195"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+Create a mapping tool which allows Open Street Maps data to be imported into Urbit from the OSM API, stored and queried locally, and exported to be rendered by existing map rendering Javascript libraries.
19+
20+This grant should involve 2 major steps:
21+
22+1: Create a client which makes it possible for OSM data in multiple formats to be serialized into Urbit and converted into a Hoon data structure.
23+
24+2: Create methods by which this data can be stored and queried in Urbit, then exported and rendered by at least two different common Javascript map rendering libraries.
25+
26+Additionally, write a one-page explanation for your design choices in the readme. Also in the readme, write an explanation of you you might expect a user-facing app to take advantage of your backend.
27+
28+### Resources:
29+
30+- [OSM Copyright and License Details](https://www.openstreetmap.org/copyright)
31+- [OSM API Usage Policy](https://operations.osmfoundation.org/policies/api/)
32+- [Rendering](https://wiki.openstreetmap.org/wiki/Rendering)
33+- [OSM File Formats](https://wiki.openstreetmap.org/wiki/OSM_file_formats)
34+
35+### Contribution Guidelines:
36+
37+- Do not begin work until your request to claim this bounty is accepted.
38+- Submit your work as a separate github repo, and email grants@urbit.org.
39+- Storage concerns: The entire OSM dataset is 40GB, so this client should be constructed so as to allow the manipulation of smaller sectors (corresponding to geographic regions) of data at any given time. The Urbit system has a memory + storage limit of 2GB.
40+- License: Make sure to read the above link carefully and credit OSM for the relevant data on any user-facing interface.
41+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
42+- You have 90 days from the time of approval to complete this bounty.
43+- Successful completion of this bounty may result in an invitation to complete other API bounties.
44+
45+
46+## Milestones
47+
48+
49+### You are finished
50+2 stars
51+Your work has been approved.
52+
53+
content/grants/overhaul-the-urbitorg-website.mdnew file+73
@@ -0,0 +1,73 @@
1++++
2+title = "Overhaul the urbit.org website"
3+date = 2021-02-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Design"]
7+[extra]
8+image = ""
9+description = "Rework urbit.org to encourage participation with the project."
10+reward = 6
11+assignee = "~radbur-sivmus"
12+id = "246698762"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+
19+The urbit.org site used to be focused almost solely on informing its readers about the project and its progress. This was due to Urbit's being "not ready" for general use. Now it is, but urbit.org doesn't reflect this. Our goal is to change this image to better demonstrate Urbit's utility through narratives that reflect different paths to participation with the project.
20+
21+## Scope
22+
23+The content of urbit.org can be broken into two components:
24+
25+1. The part concerned with explaining what Urbit is, why you should care, and what you can do with it, and
26+2. the part that documents its usage and implementation.
27+
28+This bounty is concerned only with the first part.
29+
30+## Phases
31+
32+We'll break the project into two phases—**design** and **implementation**.
33+
34+### Design
35+
36+Reworking urbit.org is a substantial undertaking and requires thoughtful planning to execute. A coherent design is key to ensuring that the site fits together.
37+
38+1. Definition of the different **personas** that arrive on urbit.org, and the **stories** that they'll follow.
39+2. An **information architecture** that maps the flow of content such that the stories can be fulfilled.
40+3. A set of **wireframes** that capture the navigational elements and content requirements in terms of the information architecture.
41+
42+It's expected that the design phase is completed within four weeks: one week for parts (1) and (2), two weeks for part (3), and an extra week for buffer.
43+
44+### Implementation
45+
46+The path to implementation is necessarily dependent on the outcomes of the design phase, but we can make the following assumptions:
47+
48+- The implementation should be time-boxed to 3-4 weeks, which includes a week of QA.
49+- The visual design should remain largely consistent with the current site. Modifications are permissible within the bounds of the [indigo](https://github.com/urbit/indigo-react) design system.
50+
51+## Other Requirements
52+
53+- You will be expected to attend our regular Monday morning design meetings with work prepared for feedback (10AM PT, usually).
54+- Frequent communication with a group of stakeholders on the project
55+
56+## Resources
57+
58+- A vision document from the Urbit Foundation will be made available.
59+- The Urbit Foundation and Tlon design team will be available for assistance and will provide feedback and design review throughout the process.
60+
61+## Milestones
62+
63+
64+### Designs are complete
65+2 stars
66+Completion of the contents of the Design section above.
67+
68+
69+### Implementation is complete
70+4 stars
71+Completion of the contents of the Implementation section above.
72+
73+
content/grants/proposals/_index.mdnew file+4
@@ -0,0 +1,4 @@
1++++
2+title = "Proposals"
3+template = "grant_type/proposals.html"
4++++
content/grants/ragnarok-online-on-urbit.mdnew file+54
@@ -0,0 +1,54 @@
1++++
2+title = "Ragnarok Online on Urbit"
3+date = 2019-08-30
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Landscape app that supports registering an urbit ID with an RO server, exposing various account management actions and guild / channel chats"
10+reward = 3
11+assignee = "~littel-wolfur"
12+id = "2084005955"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+# Ragnarok Online on Urbit
19+
20+
21+This is a Landscape / Gall app proposal for registering an urbit ID with an account in an MMORPG, with initial support for Ragnarok Online and exposing various actions like inventory management, friend lists, guild / main chat, and in-game market tools. Most importantly, account state will be persisted on your ship and can be transferred between supported servers.
22+
23+RO has a large but fragmented private server community. Both the server and game clients are heavily customizable, and there are open source tools that can manipulate the server state through the browser (create accounts, browse in-game player shops, etc).
24+
25+Since these servers are usually run by individuals, there is a very high turnover rate, with some servers not even lasting a couple months. This is very frustrating for players and is one of the main reasons people stick with the official servers, even though they are plagued with gold sellers and bots.
26+
27+But if your character state is linked to your urbit, this frustration is mitigated - you can just move to another server that will accept you. You could even register that character with another game, provided that there is some sort of mapping for acceptable character states.
28+
29+I see this as an ideal test bed for demonstrating the practical value of urbit ideals like persistence (never regret the grind again!), digital ownership (virtual items tied to your urbit id), and networked computing (automatic guild <-> group mappings, persisted friend lists). It could also be a way to get a sizeable and dedicated gaming community onto urbit. Custom quests / areas where players can learn about urbit could easily be implemented.
30+
31+Other potential outcomes:
32+
33+- In game chat channels can be mapped to urbit chats, or to urbit itself, meaning you can get in-game code evaluation. Ad-hoc addons for boss fights, guild events, and market trading maybe?
34+- An emergent reputation system - players won't want to join servers that have corrupt GMs or excessive botting, since those servers will likely be blacklisted and your character won't be transferable. Servers might also identify stars that sell planets to gold sellers and ban planets under them.
35+- Patreon-esque donation system when we get bitcoin wallet support.
36+
37+## Milestones
38+
39+
40+### Gall app
41+1 stars
42+A gall app that handles updates to all linked character states and relevant game state. The data model should be constructed with an eye towards supporting multiple games and permissioning
43+
44+
45+### Frontend UI
46+1 stars
47+Character and game state display. Should be able to view various server and character stats as well as read chat channels. Character creation and account deletion as well.
48+
49+
50+### Working connection to RO server
51+1 stars
52+A customized urbit RO server that only accepts @p logins and a documented communication pattern with the gall app.
53+
54+
content/grants/search-in-groups.mdnew file+41
@@ -0,0 +1,41 @@
1++++
2+title = "Search in groups"
3+date = 2021-02-25
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Implement a basic text search in groups channels"
10+reward = 2
11+assignee = "@nrtxrmnd"
12+id = "835369230"
13+completed = false
14+link = ""
15++++
16+
17+I saw this post in u-c feature requests channel [~bitbet-bolbel/urbit-community/resource/publish/ship/~bitpyx-dildus/feature-requests/note/170141184504903337445158066480138420224](http://localhost:8080/~landscape/ship/~bitbet-bolbel/urbit-community/resource/publish/ship/~bitpyx-dildus/feature-requests/note/170141184504903337445158066480138420224)
18+> Even the sort of thing that could be thrown together in an afternoon would be 1000x better than nothing.
19+
20+and I likewise thought even a basic search function would be immediately useful
21+
22+## Design
23+
24+The user-facing interface would be a shoe app where you enter your search word into prompt and then select from which group you would like to search from. There are additional (optional) parameters: search from a specific @p, search from before, after or specific timeframe, search from specific channel, nr. of posts to search (from latest). The app then returns the posts that contained the search word, going back as far as was specified in the nr. of nodes parameter (e.g. last 200 posts). If there is more (older) posts to search from, prompt asks if you want to search more posts.
25+This basic version of search only searches for exact word from post, when limited between whitespace and contains English characters. Later iterations will bring more improvements.
26+
27+There will also be a generator with nearly same functionality but it's stateless so could only search specified fixed nr. of posts.
28+
29+## Milestones
30+
31+
32+### search generator done
33+1 stars
34+↑
35+
36+
37+### shoe app done
38+1 stars
39+↑
40+
41+
content/grants/staff-the-urbit-help-desk-1.mdnew file+61
@@ -0,0 +1,61 @@
1++++
2+title = "Staff the Urbit Help Desk (1)"
3+date = 2020-02-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Help Urbit users with their various problems."
10+reward = 1
11+assignee = "nartes-fasrum"
12+id = "1395801018"
13+completed = true
14+link = ""
15++++
16+
17+### Background
18+
19+Urbit is live. Users frequently need help. Technical issues need to be reported. This feedback process is the primary vector for refining and improving Urbit. This bounty commissions its claimant to observe and attend to these issues presently, as they arise.
20+
21+### Bounty Description
22+
23+The claimant of this bounty will be “staffed” to the three primary Urbit chatrooms: Discord, Urbit-Help on Dopzod, and Urbit.Live’s Telegram group. They are expected to be online at least 4 hours per day to perform the following duties:
24+- Help users boot ships
25+- Recommend relevant resources
26+- Troubleshoot errors users encounter using Urbit
27+- Observe and document bugs
28+- File issues to the relevant Github repo
29+
30+Once per week, staff should send a weekly digest email to support@urbit.org, with a report of key events and hours worked.
31+
32+Staff should periodically identify themselves and announce their presence to encourage feedback.
33+
34+The bounty claimant should have competency in the following areas: Booting Urbit in terminal, Troubleshooting, Operating Urbit via the Dojo, Chat CLI, and General Urbit terminology.
35+
36+### Resources
37+Chatrooms to Monitor:
38+- [Urbit.live Telegram](https://t.me/UrbitLiveGroup)
39+- [Urbit Discord](https://discord.gg/Mae2bk7)
40+- `~dopzod/urbit-help`
41+
42+Repos to file issues:
43+
44+- [Bridge Issues on Github](https://github.com/urbit/bridge/issues)
45+- [Urbit Issues on Github](https://github.com/urbit/urbit/issues)
46+
47+### Contribution Guidelines
48+- Do not begin work until your request to claim this bounty is accepted.
49+- Claimant will be online and responsive in the chatrooms, 4 hours daily, for 30 days
50+- It may be requested that staffers modify their hours to improve coverage of issues.
51+- Estimated work: 2 - 4 hours per day
52+
53+
54+## Milestones
55+
56+
57+### You have been staffing a help desk for 30 days
58+1 stars
59+You have been responsive daily for 30 days.
60+
61+
content/grants/staff-the-urbit-help-desk-2.mdnew file+61
@@ -0,0 +1,61 @@
1++++
2+title = "Staff the Urbit Help Desk (2)"
3+date = 2020-02-21
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Help Urbit users with their various problems."
10+reward = 1
11+assignee = "sicbud (and i cannot stress this enough) hathes"
12+id = "612547183"
13+completed = true
14+link = ""
15++++
16+
17+### Background
18+
19+Urbit is live. Users frequently need help. Technical issues need to be reported. This feedback process is the primary vector for refining and improving Urbit. This bounty commissions its claimant to observe and attend to these issues presently, as they arise.
20+
21+### Bounty Description
22+
23+The claimant of this bounty will be “staffed” to the three primary Urbit chatrooms: Discord, Urbit-Help on Dopzod, and Urbit.Live’s Telegram group. They are expected to be online at least 4 hours per day to perform the following duties:
24+- Help users boot ships
25+- Recommend relevant resources
26+- Troubleshoot errors users encounter using Urbit
27+- Observe and document bugs
28+- File issues to the relevant Github repo
29+
30+Once per week, staff should send a weekly digest email to support@urbit.org, with a report of key events and hours worked.
31+
32+Staff should periodically identify themselves and announce their presence to encourage feedback.
33+
34+The bounty claimant should have competency in the following areas: Booting Urbit in terminal, Troubleshooting, Operating Urbit via the Dojo, Chat CLI, and General Urbit terminology.
35+
36+### Resources
37+Chatrooms to Monitor:
38+- [Urbit.live Telegram](https://t.me/UrbitLiveGroup)
39+- [Urbit Discord](https://discord.gg/Mae2bk7)
40+- `~dopzod/urbit-help`
41+
42+Repos to file issues:
43+
44+- [Bridge Issues on Github](https://github.com/urbit/bridge/issues)
45+- [Urbit Issues on Github](https://github.com/urbit/urbit/issues)
46+
47+### Contribution Guidelines
48+- Do not begin work until your request to claim this bounty is accepted.
49+- Claimant will be online and responsive in the chatrooms, 4 hours daily, for 30 days
50+- It may be requested that staffers modify their hours to improve coverage of issues.
51+- Estimated work: 2 - 4 hours per day
52+
53+
54+## Milestones
55+
56+
57+### You have been staffing a help desk for 30 days
58+1 stars
59+You have been responsive daily for 30 days.
60+
61+
content/grants/staff-the-urbit-helpdesk-east.mdnew file+60
@@ -0,0 +1,60 @@
1++++
2+title = "Staff the Urbit Helpdesk, East"
3+date = 2021-01-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Help guide newcomers onto the network."
10+reward = 1
11+assignee = "~libmud-bonted"
12+id = "1140084926"
13+completed = true
14+link = ""
15++++
16+
17+### Overview
18+
19+Urbit is pretty novel, and newcomers are often confused by the many new concepts they’re confronted with early on. As someone who’s been there before, you can help guide aspiring new Martians into the community by supporting them with their technical issues.
20+
21+### Details
22+
23+You will “staff the help desk,” which means watching our [Discord server](https://discord.gg/Mae2bk7) and the Help channel within Urbit Community for support requests. You’re expected to be online for at least **four hours** within the hours of 0000-0800 UTC (4pm - 12am PST), for five days a week over the course of a month.
24+
25+You’re expected to:
26+- Help users boot ships
27+- Recommend relevant resources
28+- Troubleshoot errors users encounter using Urbit
29+- Observe and document bugs
30+- File issues to the relevant Github repo
31+- Issue pull requests to the documentation should inaccuracies present themselves
32+
33+Once per week, staff should send a weekly digest email to support@urbit.org, with a report of key events and hours worked.
34+
35+It will help if you identify yourself periodically as a support resource so that users know they can ask questions of you. Using a nickname could be helpful here.
36+
37+### Resources
38+
39+- [Bridge Issues](https://github.com/urbit/bridge/issues)
40+- [Urbit Issues](https://github.com/urbit/urbit/issues)
41+- [Docs issues](https://github.com/urbit/docs)
42+
43+### Contribution Guidelines
44+
45+- Do not begin work until your request to claim this bounty is accepted.
46+- Claimant will be online and responsive, 4 hours daily, for 30 days
47+- It may be requested that staffers modify their hours to improve coverage of issues.
48+- Estimated work: 2 - 4 hours per day
49+
50+
51+
52+
53+## Milestones
54+
55+
56+### Work Complete
57+1 stars
58+You've spent the last month helping out newcomers.
59+
60+
content/grants/staff-the-urbit-helpdesk-west.mdnew file+57
@@ -0,0 +1,57 @@
1++++
2+title = "Staff the Urbit Helpdesk, West"
3+date = 2020-12-03
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Help guide newcomers onto the network."
10+reward = 1
11+assignee = "Conrad"
12+id = "123890561"
13+completed = true
14+link = ""
15++++
16+
17+### Overview
18+
19+Urbit is pretty novel, and newcomers are often confused by the many new concepts they’re confronted with early on. As someone who’s been there before, you can help guide aspiring new Martians into the community by supporting them with their technical issues.
20+
21+### Details
22+
23+You will “staff the help desk,” which means watching our [Discord server](https://discord.gg/Mae2bk7) and the Help channel within Urbit Community for support requests. You’re expected to be online for at least **four hours** within the hours of 1600-0000 UTC (8am - 4pm PT), for five days a week over the course of a month.
24+
25+You’re expected to:
26+- Help users boot ships
27+- Recommend relevant resources
28+- Troubleshoot errors users encounter using Urbit
29+- Observe and document bugs
30+- File issues to the relevant Github repo
31+- Issue pull requests to the documentation should inaccuracies present themselves
32+
33+Once per week, staff should send a weekly digest email to support@urbit.org, with a report of key events and hours worked.
34+
35+It will help if you identify yourself periodically as a support resource so that users know they can ask questions of you. Using a nickname could be helpful here.
36+
37+### Resources
38+
39+- [Bridge Issues](https://github.com/urbit/bridge/issues)
40+- [Urbit Issues](https://github.com/urbit/urbit/issues)
41+- [Docs issues](https://github.com/urbit/docs)
42+
43+### Contribution Guidelines
44+
45+- Do not begin work until your request to claim this bounty is accepted.
46+- Claimant will be online and responsive, 4 hours daily, for 30 days
47+- It may be requested that staffers modify their hours to improve coverage of issues.
48+- Estimated work: 2 - 4 hours per day
49+
50+## Milestones
51+
52+
53+### Work Complete
54+1 stars
55+You've spent the last month helping out newcomers.
56+
57+
content/grants/the-complete-guide-to-gall-and-landscape.mdnew file+77
@@ -0,0 +1,77 @@
1++++
2+title = "The Complete Guide to Gall and Landscape"
3+date = 2020-06-22
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "A full text and video course on every aspect of creating Gall and Landscape apps. Students will create their own full application to finish."
10+reward = 4
11+assignee = "~timluc-miptev"
12+id = "2061597290"
13+completed = true
14+link = ""
15++++
16+
17+# Gall Guide Deliverables
18+
19+## PoC and Prior Work
20+The first 5 chapters of the course are complete in late draft form and can be found [here](https://github.com/timlucmiptev/gall-guide/blob/master/guide-docs/overview.md)
21+
22+My ["Nock for Everyday Coders" Guide](https://blog.timlucmiptev.space/part1.html) was the result of my exploring Nock on my own, and is probably the most detailed Nock reference available currently.
23+
24+## Overview and Goals
25+
26+Develop a Hooniversity module for teaching Gall and creating and modifying Gall applications.
27+
28+The final product will contain all lessons (which incrementally build on each other), example code and reference items needed to transfer this knowledge with no gaps or unanswered questions.
29+
30+The student who completes this course will not only be able to author their own Landscape app, but the learning program associated with these materials will mandate that accomplishment in order for a student to be considered to have passed Hooniversity Gall training.
31+
32+## Table of Contents
33+
34+### Basic Backend
35+* Workflow Setup(2 hours)
36+* The 10 Arms of Gaal: App Structure(4 hours)
37+* App Lifecycle and State(5 hours)
38+* Importing Code and Static Resources(5 hours)
39+* Poke and Watch(6 hours)
40+
41+(From this point onward in the course, all lessons will be in the context of building up a full-featured application)
42+* Communicating with the Outside World (HTTP)(2 hours)
43+* Setting up Data Structures(3 hours)
44+
45+### Frontend
46+* Landscape: GUI for Gall](3 hours)
47+* Walkthrough: Landscape Skeleton](4 hours)
48+* Communicating with Landscape (Subscriptions)](3 hours)
49+* Everything about React for Landscape](6 hours)
50+
51+### More Backend
52+* Calling the OS (Arvo)](3 hours)
53+* Communicating with Other Ships](3 hours)
54+* Store/Hook/View](4 hours)
55+
56+### Appendix
57+* Troubleshooting & FAQ](1 hour)
58+* Types Used in Gall Apps](2 hours)
59+* Common Hoon Idioms Used in Gall](1 hour)
60+
61+## Video Materials
62+* 5 Lessons of 2-3 hours in length each, taught on a weekly basis to help students through the material who are more interactive learners.
63+
64+## Milestones
65+
66+
67+### Written Guide
68+1 stars
69+Full written guide (table of contents in proposal) posted online.
70+
71+
72+### Videos Courses & Full Sample Application
73+1 stars
74+* Videos made for the course
75+* Full sample application finished and polished with extensive commenting, integrated into the lessons
76+
77+
content/grants/thread-documentation.mdnew file+75
@@ -0,0 +1,75 @@
1++++
2+title = "Thread Documentation"
3+date = 2021-02-18
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Document, explain, and give simple howtos for the usage patterns of threads in the Dojo and Gall agents."
10+reward = 1
11+assignee = "~tinnus-napbus"
12+id = "4948904"
13+completed = true
14+link = ""
15++++
16+
17+# Thread Documentation Bounty
18+The [official thread documentation](https://urbit.org/docs/tutorials/arvo/gall/#threads) is accurate and helpful, but it's a very thin combination of explainer (production code), how-to, and reference. It's a nice starting point, but it's not sufficient to let a typical Urbit autodidact enthusiast get fully comfortable with threads. As a result, they are often an uncomfortable/unused part of the Urbit system, even though they are useful and robust.
19+
20+Fortunately, the amount of implicit knowledge needed to build a strong mental model of threads and begin using them in Urbit applications. By expanding the explainer/tutorial/howto/reference and delineating them more clearly, we can expose this part of Urbit to devs.
21+
22+This bounty is detailed for clarity, but the individual sections shouldn't take too long to write and don't need to be extremely long.
23+
24+## scope
25+* `ted` directory
26+* `spider` usage in Gall
27+* calling from the dojo with `-`
28+* the `bind`/`;<` chaining model
29+* how `spider` manages its threads
30+
31+### not in scope
32+* aqua
33+
34+## sections
35+### tutorial
36+* Walk through building a thread that composes multiple threads
37+* Will be all from the Dojo using `-`, no Gall
38+* Should include the following calls
39+ - setting a timeout
40+ - pass cards to Arvo/Gall
41+ - HTTP call
42+ - read a file from Clay
43+
44+### explainer
45+* use `lib/strand.hoon` code to explain `bind` and the `%wait` etc. objects
46+* explain how all threads MUST take `strand-input` as an argument
47+* explain how `spider` sends `strand-input` to threads and how it determines which threads to send to.
48+
49+### how-to
50+* Call out to outside web services, chaining calls in the manner of promises/async in other languages
51+* make system calls to Arvo
52+* receive/handle responses from Arvo
53+* use `spider` to integrate with Gall
54+* use `retry` and `backoff` for calls that may fail
55+
56+### reference
57+This can be thin for now, because most necessary thread functions are in `lib/strandio.hoon`, and we don't need to just cut-and-paste that. Just make a quick list of functionality in `lib/strandio` or edit the one in the current thread docs
58+
59+## user stories
60+* as a learner with Hoon knowledge, I will be able to build a mental model of how `spider` manages threads, sends input to them, and chains them together. `bind` and `;<` will be demystified and explained in very simple, mechanical ways.
61+* as a Hoon learner with prior monad experience, I should be able to get a feel for the similarities of IO monads and Urbit threads, and develop strong intuitions for the more mechanical nature of Urbit ones.
62+* as a moderately motivated autodidact with Hoon knowledge I should be able to start writing `ted` threads for Dojo usage immediately, with no other outside materials or informal help needed
63+* as a Gall app developer or maintainer, I should be able to integrate threads into my Gall apps
64+
65+## resources available
66+`~timluc-miptev` will be available to whomever does the bounty to explain things, work through any tough spots, and connect to useful people if necessary.
67+
68+## Milestones
69+
70+
71+### Complete the bounty
72+1 stars
73+Everything in "sections" is done.
74+
75+
content/grants/tor-nodes-relay-search-tile.mdnew file+47
@@ -0,0 +1,47 @@
1++++
2+title = "Tor Nodes Relay Search Tile"
3+date = 2020-03-31
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "An Urbit-native Tor search-tool."
10+reward = 3
11+assignee = "pilwex-migsun"
12+id = "872371692"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+### Bounty Description
19+
20+Create a backend for importing Tor network node relay search data into Urbit, and design a Landscape tile which will serve as a functional search tool for Tor relay node information inside Urbit.
21+
22+We would like to create an Urbit-native Tor node relay search tool which replicates the same functions as the search tool linked below.
23+
24+### Resources
25+
26+- [Tor Metrics Relay Search Tool](https://metrics.torproject.org/rs.html#simple)
27+- [Tor Metrics Relay Developer Resources](https://metrics.torproject.org/development.html)
28+
29+### Contribution Guidelines:
30+
31+- Do not begin work until your request to claim this bounty is accepted.
32+- Please abide by the rules of the Creative Commons 1.0 Universal License in working with this data.
33+- Submit your work as a pull request to the [urbit/urbit](https://github.com/urbit/urbit) repo
34+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
35+- You have 90 days from the time of approval to complete this bounty.
36+- Successful completion of this bounty may result in an invitation to complete other API integration bounties.
37+
38+
39+
40+## Milestones
41+
42+
43+### Your PR is merged
44+3 stars
45+Your code is accepted and merged.
46+
47+
content/grants/translate-key-parts-of-urbitorg-into-german.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Translate key parts of Urbit.org into German"
3+date = 2021-01-19
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup (analog to Korean translation)"
10+reward = 1
11+assignee = "~hocdep-labtel"
12+id = "1163466965"
13+completed = false
14+link = ""
15++++
16+
17+Analog to https://grants.urbit.org/proposals/1921641407-translate-key-parts-of-urbit-org-into-korean this would provide the core parts of the Documentation in German language, in order to make it more accessible to a wider audience.
18+
19+Files could be sent in Markdown as PR to the urbit/docs repository or be transmitted via Email.
20+
21+I am a native German speaker with a long history of speaking and writing English and currently assisting in the translation team of a worldwide operating education and development enterprise, doing both written translation as well as live interpretation.
22+
23+## Milestones
24+
25+
26+### Translation of Key Website Content
27+1 stars
28+Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup
29+
30+
content/grants/translate-key-parts-of-urbitorg-into-korean.mdnew file+31
@@ -0,0 +1,31 @@
1++++
2+title = "Translate key parts of Urbit.org into Korean"
3+date = 2021-01-30
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "The content found on urbit.org/understanding-urbit/ and urbit.org/using/install/ is only in English. Translation will be helpful to Koreans."
10+reward = 1
11+assignee = "~sibped-dabdul, 홍송이"
12+id = "1921641407"
13+completed = false
14+link = ""
15++++
16+
17+Currently, Urbit's documentation is almost exclusively in English. In an effort to make Urbit more google-able and accessible to a Korean audience, we propose translating key parts of Urbit.org into Korean. Translated content can either be hosted on another blog/website or the HTML files can be turned over to Urbit.org.
18+
19+I am a native English speaker with a high level of competence in written Korean. I am currently assisting a small Korean game studio with localizing their game into English. I am proficient with OmegaT (CAT). Song-i Hong is a native Korean and fluent English speaker with ten years of experience working closely with foreigners. Together, we translated the Urbit Wikipedia article: https://ko.wikipedia.org/wiki/%EC%96%B4%EB%B9%97
20+
21+At the current pace we are translating a little under 1000 words per week. The total amount to be translated is a little over 9000 words.
22+
23+
24+## Milestones
25+
26+
27+### Translation of Key Website Content
28+1 stars
29+Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup
30+
31+
content/grants/translate-key-parts-of-urbitorg-into-norwegian.mdnew file+32
@@ -0,0 +1,32 @@
1++++
2+title = "Translate key parts of Urbit.org into Norwegian"
3+date = 2021-04-07
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Norwegian."
10+reward = 1
11+assignee = "Andreas Atakan"
12+id = "1227012285"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+Similar to other translation proposals for German, Korean and Spanish, I would provide the core parts of the Documentation in Norwegian, in order to improve accessibility of the Urbit project.
19+Translations can for example be provided as pull requests to the urbit.org repo.
20+
21+I am a native speaker of Norwegian and have lived in Norway my whole life. I also speak English fluently.
22+I have extensive technical experience working as a full-stack web-developer, and specialized experience from several years working as a GIS consultant in the off-shore sector in Norway. I also have experience working with blockchain technologies, and I'm currently hosting a bitcoin- and lightning-node on a hobby basis.
23+In addition to contributing with my translation work, I can also contribute to the Urbit community with my experience of integrating dynamic web-maps into web-applications (like for example React-based apps).
24+
25+## Milestones
26+
27+
28+### Translation of key site content
29+1 stars
30+Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup
31+
32+
content/grants/translate-key-parts-of-urbitorg-into-spanish.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Translate key parts of Urbit.org into Spanish"
3+date = 2021-03-20
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "Help the Urbit community grow internationally by translating key resources, guides, and documentation to Spanish."
10+reward = 1
11+assignee = "Tom Holford"
12+id = "446864346"
13+completed = false
14+link = ""
15++++
16+
17+Similar to other translation proposals for German and Korean, this would provide the core parts of the Documentation in the Spanish language, in order to improve accessibility and accelerate the growth of Urbit.
18+
19+Translations can be provided as pull requests to the urbit.org repo, or whatever is convenient for the team managing the resource.
20+
21+I am a fluent speaker with 20+ years of experience with the language and have lived in a handful of Spanish-speaking locales for several years. With professional experience as a programmer and teacher, I am skilled at breaking down complex technical concepts to new learners.
22+
23+## Milestones
24+
25+
26+### Translation of key site content
27+1 stars
28+Introduction, Urbit OS, Urbit ID, Interface, Roadmap: OS1-> OS N, People + History, and Install + Setup
29+
30+
content/grants/try-urbit-website.mdnew file+32
@@ -0,0 +1,32 @@
1++++
2+title = "Try Urbit Website"
3+date = 2021-02-14
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "A website where prospective Martians can experience the Landscape interface without any technical chops."
10+reward = 2
11+assignee = "mikeosborne"
12+id = "1413934727"
13+completed = false
14+link = ""
15++++
16+
17+Landing page of website collects minimal information from visitor: Name, email, optional opt-in to foundation newsletter. They are then redirected to a live Landscape interface to "kick the tires" on Urbit as a comet. There will be instruction about how the interface works, what activities to do, etc.
18+
19+The server will run a script that "pre-mines" comets to create a pool of IDs and "+code" secrets. It will monitor activity to ensure enough comets are mined to keep up with demand.
20+
21+The server will also maintain a database of users, status, comet ID, process ID and timestamp when assigned to user. After a predetermined time (1 day?), the server will send an email asking if the user still wants to keep their comet, then stops the process if they reply no or don't reply after some time.
22+
23+The website will have an admin interface with performance stats. It will also allow admins to set up email alerts on usage, processes, comet pool, etc.
24+
25+## Milestones
26+
27+
28+### Project complete
29+2 stars
30+Website and sever side scripts complete and deployed.
31+
32+
content/grants/typescript-airlock-library.mdnew file+44
@@ -0,0 +1,44 @@
1++++
2+title = "Typescript Airlock Library"
3+date = 2020-06-26
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Create a library for the Typescript language to be used for Airlock, the API suite for outside communication with Urbit."
10+reward = 3
11+assignee = "~radbur-sivmus"
12+id = "1845001687"
13+completed = true
14+link = ""
15++++
16+
17+Create an Airlock library for the Typescript programming language. Airlock is the set of HTTP APIs for communicating with an Urbit. This bounty will involve creating a Typescript library wrapper for the server side event and HTTP API.
18+
19+Additionally, write a one-page explanation for the design choices for this library in the readme. If you have ideas for what Urbit applications would be useful for this library, please also include those suggestions in the readme.
20+
21+### Resources:
22+
23+- https://github.com/urbit/urbit/blob/master/pkg/arvo/sys/vane/eyre.hoon#L493
24+- https://github.com/baudtack/urlock-py
25+- [UrlockPy as an example of an Airlock integration](https://github.com/urbit/docs/pull/892)
26+
27+
28+### Contribution Guidelines:
29+
30+- Do not begin work until your request to claim this bounty is accepted.
31+- Submit your work as a separate github repo, and include a link to it in your submission. Email grants@urbit.org if you have trouble.
32+- Your library should be uploaded and available in a format compatible with the package manager you feel most comfortable maintaining.
33+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
34+- You have 90 days from the time of approval to complete this bounty.
35+- Successful completion of this bounty may result in an invitation to complete other Airlock library bounties. If you are interested in creating an Airlock library for a language other than the ones currently presented, please contact us at grants@urbit.org; it’s likely we’ll approve this as a proposal.
36+
37+## Milestones
38+
39+
40+### Your work is finished
41+3 stars
42+You have completed your work and pushed it to a Github repo.
43+
44+
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+
content/grants/ucal-google-and-outlook-integration.mdnew file+84
@@ -0,0 +1,84 @@
1++++
2+title = "ucal Google and Outlook Integration"
3+date = 2021-05-13
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Extend the Urbit Calendar (ucal) to integrate with other calendaring systems."
10+reward = 1
11+assignee = ""
12+id = ""
13+completed = false
14+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0014&prefill_Grant+Name=ucal%20Google%20and%20Outlook%20Integration"
15++++
16+
17+### Purpose
18+
19+The current ucal project has .ics support, but does not currently sync with Google and Outlook. This creates a chicken-egg problem, where users in organizations with those tools cannot reliably migrate to using ucal, because they can't correctly expose availability.
20+
21+Tools like the iPhone Calendar app handle this by syncing from and to those calendars. This lets them handle their own native calendar events while also exposing a user's full calendar to that user. Our goal is to replicate that model in Urbit.
22+
23+This is a project intended primarily for developer use. Once it is completed, it will:
24+
25+ - unlock further development of ucal for end users
26+ - allow use of Urbit ucal as a single source of truth to manage a user's schedule, inside and outside of Urbit
27+ - enable future integration with WebRTC for native Urbit video calls and ephemeral chats
28+
29+### End Product
30+
31+This project will produce threads used to call Google and Outlook.
32+
33+The step of "pushing" events to Google, Outlook and other ucal users should be implemented as producing custom data structures ("cards") that a later Gall agent will route appropriately.
34+
35+todo: find out which files the below goes into and where the ICS type is.
36+
37+ - mar
38+ -- modify the grow arm to take an ICS Hoon type and convert to a valid ICS calendar file
39+ - lib
40+ -- add a converter from ICS to
41+ - ted
42+ -- take a user's authentication info
43+ -- pull Google or Outlook ICS file
44+ -- convert into Hoon format
45+ -- push Hoon calendar events to Google or Outlook
46+ -- push calendar events to other ucal users
47+ - tests
48+ -- unit tests of outside ICS files parsing into Hoon format
49+ -- unit tests of Hoon calendar structures into ICS
50+ -- unit test producing "cards" representing calendar event updates
51+ -- thread testing of syncing
52+ - possible external code
53+ -- handle situation when extra auth flows are needed with Google/MS.
54+ -- could require a webpage to be opened to generate an OAuth code or similar
55+
56+This code will not need to be merged into Urbit core.
57+
58+### User Stories
59+
60+As a developer, I want to
61+
62+ - input credentials for a Google or Outlook calendar
63+ - retrieve ICS files associated with those credentials
64+ - create/modify events
65+ - push out created/modified events as updates to ucal or external users
66+
67+### Resources and Workflow
68+ - Improvements will be PRs to the https://github.com/taalhavras/ucal/ project
69+ - Contributor will check in weekly with a Foundation director
70+ - Current ucal contributors
71+ - Example article on pulling ICS files from those services: https://www.digitaltrends.com/computing/how-to-sync-outlook-calendar-with-google-calendar/
72+
73+### Milestones
74+
75+1) Data conversion, sync and calendar updates
76+ Estimate: 21 days - a month | Reward: 2 Stars
77+
78+ - handle credential imput and auth flows
79+ - handle syncing
80+ - push updates to Google/Outlook calendars from CLI
81+ - push updates to Urbit Calendar
82+
83+
84+
content/grants/udon-syntax-highlighter.mdnew file+43
@@ -0,0 +1,43 @@
1++++
2+title = "Udon syntax highlighter"
3+date = 2019-07-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = ""
9+description = "Write a syntax highlighter for the Udon markup language."
10+reward = 1
11+assignee = "~dirwex-dosrev"
12+id = "981084186"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+#### Background
19+
20+Udon is a minimalist markup language for creating and rendering text documents, with a Markdown-inspired syntax. It’s used as the native language for publishing on Modulo, Urbit’s web interface.
21+
22+#### Bounty Description
23+
24+Write a CodeMirror language-mode file that results in correct syntax highlighting for the Udon markup language. Use Markdown syntax highlighting as inspiration, and follow it closely.
25+
26+#### Resources
27+
28+* Read the [Udon guide](https://urbit.org/docs/using/sail-and-udon/)
29+* Familiarize yourself with the Udon parser under the `+cram` arm, at lines 15,310 through 15,538 in `hoon.hoon`.
30+* Familiarize yourself with the Udon compiler in the `cram.hoon` file under `/lib`.
31+
32+#### Contribution Guidelines
33+
34+* Your submission should come in the form of a single JavaScript file. Email the submission to grants@urbit.org
35+
36+## Milestones
37+
38+
39+### The highlighter is complete
40+1 stars
41+The highlighter has been finished and tested, and the language-mode file is finished.
42+
43+
content/grants/unit-tests-for-json-parsing.mdnew file+49
@@ -0,0 +1,49 @@
1++++
2+title = "Unit tests for JSON parsing"
3+date = 2019-11-15
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Write unit tests for JSON-parsing arms of the zuse.hoon standard library."
10+reward = 2
11+assignee = "courajs"
12+id = "905205498"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+
19+Zuse is a part of the Hoon standard library. We want to make sure the JSON-parsing functions contained in Zuse do what they are supposed to do.
20+
21+#### Bounty Description
22+
23+Write unit tests which confirm that **every** function under the `+format` ([lines 5644 to 6113](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/zuse.hoon#L5644-L6113)) arm behaves as intended. These functions include, but are not limited to, `+enjs`, `+dejs`, and `+dejs-soft`. They turn nouns into JSON, and vice-versa. `+format` is located in `/sys/zuse.hoon`.
24+
25+Also write unit tests which confirm that the functions `+en-json` ([lines 6351 to 6403](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/zuse.hoon#L6351-L6403)) and `+de-json` ([lines 6404 to 6422](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/zuse.hoon#L6404-L6422)) behave as intended. These functions turn JSON text into JSON noun and back. They are located under the `+html` arm in `/sys/zuse.hoon.`
26+
27+Save the test files in the `/tests/sys/hoon` directory in Arvo. Use the same framework as the files that already exist in `/tests`.
28+
29+#### Resources
30+
31+* Read the [guide](https://github.com/urbit/urbit/blob/master/pkg/arvo/TESTING.udon) to writing unit tests in Hoon.
32+* [Here](https://github.com/urbit/urbit/blob/alef2/pkg/arvo/tests/sys/zuse/ordered-map.hoon) is an example test file for the new Ames. Your tests should be similar to it.
33+
34+#### Contribution Guidelines
35+
36+* You have 45 days from the time of approval to complete this bounty.
37+* Do not begin work until your request to claim this bounty is accepted.
38+* Your tests should be written as two files: one file for `+format` functions and one file for `+html` functions.
39+* Write the appropriate number of unit tests per function. Some arms will only need one test, but some arms may or may not require more. An insufficient number of tests for arms may result in your submission being rejected.
40+* Submit your tests as a PR to the [“urbit” repository](https://github.com/urbit/urbit). Your test file should be under `pkg/arvo/tests/sys/hoon` within the repository. Link this bounty in the PR’s description.
41+
42+## Milestones
43+
44+
45+### Test files are merged
46+2 stars
47+Your test files are accepted and merged on GitHub.
48+
49+
content/grants/unit-tests-for-pure-algorithms.mdnew file+61
@@ -0,0 +1,61 @@
1++++
2+title = "Unit tests for pure algorithms"
3+date = 2019-07-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Write unit tests for +in, +by, +to, and +diff."
10+reward = 1
11+assignee = "yosoyubik"
12+id = "1322185260"
13+completed = true
14+link = ""
15++++
16+
17+#### Bounty Description
18+
19+Write unit tests which confirm that every function under the `+in` (sets), `by` (maps), and `+to` (queues) arms behaves as intended. These functions can be found in sections [2h](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/hoon.hoon#L1142-L1368), [2i](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/hoon.hoon#L1370-L1679), and [2k](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/hoon.hoon#L1734-L1813) of the Hoon standard library, respectively. They are located in `/sys/hoon.hoon`.
20+
21+Also write unit tests for the functions under the `+differ` arm [in `/sys/zuse.hoon`](https://github.com/urbit/urbit/blob/master/pkg/arvo/sys/zuse.hoon#L6117-L6271). These functions are a suite of Hunt-McIlroy `diff` and `merge` algorithms.
22+
23+Save the test files in the `/tests/sys/hoon` directory in Arvo. Use the same framework as the files that already exist in `/tests`.
24+
25+#### Resources
26+
27+* Read the [guide](https://github.com/urbit/urbit/blob/master/pkg/arvo/TESTING.udon) to writing unit tests in Hoon.
28+* Read the documentation on [sets](https://urbit.org/docs/reference/library/2h/), [maps](https://urbit.org/docs/reference/library/2i/), and [queues](https://urbit.org/docs/reference/library/2k/).
29+* [Here](https://github.com/urbit/urbit/blob/alef2/pkg/arvo/tests/sys/zuse/ordered-map.hoon) is an example test file for the new Ames. Your tests should be similar to it.
30+
31+#### Contribution Guidelines
32+
33+* Do not begin work until your request to claim this bounty is accepted.
34+* Your tests should be written as four files, with one for each core (`+in`, `+by`, `+to`, and `+differ`).
35+* Write the appropriate number of unit tests per function. Some arms will only need one test, but some arms may or may not require more. An insufficient number of tests for arms may result in your submission being rejected.
36+* Submit your tests as a PR to the [“urbit” repository](https://github.com/urbit/urbit). Your test file should be under `pkg/arvo/tests/sys/hoon` within the repository. Link this bounty in the PR’s description.
37+* You have 30 days from the time of approval to complete this bounty.
38+
39+#### Resources
40+
41+* Read the [guide](https://github.com/urbit/urbit/blob/master/pkg/arvo/TESTING.udon) to writing unit tests in Hoon.
42+* Read the documentation on [sets](https://urbit.org/docs/reference/library/2h/), [maps](https://urbit.org/docs/reference/library/2i/), and [queues](https://urbit.org/docs/reference/library/2k/).
43+* [Here](https://github.com/urbit/urbit/blob/alef2/pkg/arvo/tests/sys/zuse/ordered-map.hoon) is an example test file for the new Ames. Your tests should be similar to it.
44+
45+#### Contribution Guidelines
46+
47+* Do not begin work until your request to claim this bounty is accepted.
48+* Your tests should be written as four files, with one for each arm (`+in`, `+by`, `+to`, and `+differ`).
49+* Write the appropriate number of unit tests per function. Some arms will only need one test, but some arms may or may not require more. An insufficient number of tests for arms may result in your submission being rejected.
50+* Submit your tests as a PR to the [“urbit” repository](https://github.com/urbit/urbit). Your test file should be under `pkg/arvo/tests/sys/hoon` within the repository. Link this bounty in the PR’s description.
51+* You have 30 days from the time of approval to complete this bounty.
52+
53+
54+## Milestones
55+
56+
57+### Test files are merged
58+1 stars
59+Your test files are accepted and merged on GitHub.
60+
61+
content/grants/unit-tests-for-sha-functions.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+title = "Unit tests for SHA functions"
3+date = 2019-07-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "Write unit tests for SHA cryptographic functions of the Hoon standard library."
10+reward = 1
11+assignee = "Ken Meier"
12+id = "179152973"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+
19+Urbit relies on Hoon cryptographic functions. We want to make sure that these functions are correct.
20+
21+#### Bounty Description
22+
23+Write unit tests which confirm that the functions in section 3d of `hoon.hoon` ([lines 3245 to 3665)](https://github.com/urbit/urbit/blob/master/pkg/arvo/sys/hoon.hoon#L3245-L3665) behave as intended.
24+
25+For each function, pull a list of standard input-output pairs from an authoritative source on the algorithm. Look at specifications requests for comment for the relevant algorithms. Other testing functionality is welcome.
26+
27+Save the test file in the `/tests/sys/hoon` directory in Arvo. Use the same framework as the files that already exist in `/tests`.
28+
29+#### Resources
30+
31+* Read the [guide](https://github.com/urbit/urbit/blob/master/pkg/arvo/TESTING.udon) to writing unit tests in Hoon.
32+* Read the [documentation](https://urbit.org/docs/reference/library/3d/) for section 3d.
33+* [Here](https://github.com/urbit/urbit/blob/alef2/pkg/arvo/tests/sys/zuse/ordered-map.hoon) is an example test file for the new Ames. Your tests should be similar to it.
34+
35+#### Contribution Guidelines
36+
37+* Do not begin work until your request to claim this bounty is accepted.
38+* You have 45 days from approval to complete the bounty.
39+* Your tests should be written as one file.
40+* Write the appropriate number of unit tests per function. Some arms will only need one test, but some arms may or may not require more. An insufficient number of tests for arms may result in your submission being rejected.
41+* Submit your tests as a PR to the [“urbit” repository](https://github.com/urbit/urbit). Your test file should be under `pkg/arvo/tests/sys/hoon` within the repository. Link this bounty in the PR’s description.
42+
43+## Milestones
44+
45+
46+### Your test file is merged
47+1 stars
48+Your test file for all the relevant functions is accepted and merged.
49+
50+
content/grants/unit-tests-for-zuse-cryptographic-functions.mdnew file+52
@@ -0,0 +1,52 @@
1++++
2+title = "Unit tests for Zuse cryptographic functions"
3+date = 2019-07-25
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = ""
9+description = "Write unit tests for cryptographic functions of the Zuse library."
10+reward = 1
11+assignee = "lukechampine"
12+id = "1097913361"
13+completed = true
14+link = ""
15++++
16+
17+#### Background
18+
19+Urbit relies on Hoon cryptographic functions for its security. We want to take steps towards being confident that these functions are reliable.
20+
21+#### Bounty Description
22+
23+Write unit tests which assert that every function under the `+crypto` ([lines 2819 to 6113 of `zuse.hoon`](https://github.com/urbit/urbit/blob/0b0766b32b82a294b81f8f405548eb9f16d8c318/pkg/arvo/sys/zuse.hoon#L5644-L6113)) arm behaves as intended. These functions include, but are not limited to, `+enjs`, `+dejs`, and `+dejs-soft`. `+crypto` is located in `/sys/zuse.hoon`, in section 2b.
24+
25+These tests should:
26+
27+Confirm that Zuse functions match output from industry-standard implementations. For example, NaCl, secp256k1, openssl, and so on.
28+Use recommended test vectors where appropriate. For example, [RFC 231](https://tools.ietf.org/html/rfc4231) provides recommended test vectors for the HMAC SHA family.
29+
30+Save the test files in the `tests/sys/zuse/crypto` directory in Arvo. Use the same framework as the files that already exist in `/tests`.
31+
32+#### Resources
33+
34+* Read the [guide](https://github.com/urbit/urbit/blob/master/pkg/arvo/TESTING.udon) to writing unit tests in Hoon.
35+* Read the guide to [contributing](https://github.com/urbit/urbit/blob/master/CONTRIBUTING.md).
36+* [Here](https://github.com/urbit/urbit/blob/alef2/pkg/arvo/tests/sys/zuse/ordered-map.hoon) is an example test file for the new Ames. Your tests should be similar to it.
37+
38+#### Contribution Guidelines
39+
40+* Do not begin work until your request to claim this bounty is accepted.
41+* You have 60 days from acceptance to complete this bounty.
42+* Write the appropriate number of unit tests per function. Some arms will only need one test, but some arms may or may not require more. An insufficient number of tests for arms may result in your submission being rejected.
43+* Submit your tests as a PR to the [“urbit” repository](https://github.com/urbit/urbit). Your test file should be under `pkg/arvo/tests/sys/hoon` within the repository. Link this bounty in the PR’s description.
44+
45+## Milestones
46+
47+
48+### Your test file is merged
49+1 stars
50+Your test file for all the relevant functions is accepted and merged.
51+
52+
content/grants/up-to-date-hoon-reference-card.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Up-to-date Hoon reference card"
3+date = 2020-03-15
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "I have made an up-to-date version of the Urbit Hoon reference card and will maintain it.https://github.com/natareo/hooncard"
10+reward = 1
11+assignee = "N E Davis"
12+id = "607772785"
13+completed = true
14+link = ""
15++++
16+
17+I have made and will maintain an up-to-date Urbit Hoon reference card. (I am segregating my course-related work very carefully from my Urbit-hobbyist work—although I will use this should my grad course be approved by the dept I am putting it forward as a public resource.)
18+
19+You can see the current version here: https://github.com/natareo/hooncard/blob/master/hooncard.pdf
20+
21+I put 1 star, but, whatever, I don't really think this is worth a whole star—I was encouraged to put this up as a proposal, which has the added benefit of making Tlon aware that this now exists. But if not, a Nock shirt or the like would be nice.
22+
23+## Milestones
24+
25+
26+### Make card public
27+1 stars
28+Make an accurate, up-to-date Hoon reference card available.
29+
30+
content/grants/urbian-a-customized-linux-distribution-for-urbit-appliances.mdnew file+86
@@ -0,0 +1,86 @@
1++++
2+title = "Urbian: a customized Linux distribution for Urbit appliances"
3+date = 2020-10-06
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Bromeliaceae20020312.JPG/640px-Bromeliaceae20020312.JPG"
9+description = "A package for the generation of custom Linux images with Urbit running as service, for the backend of a turnkey Urbit appliance or IoT hub."
10+reward = 2
11+assignee = "~botter-nidnul"
12+id = "337545546"
13+completed = false
14+link = ""
15++++
16+
17+### Purpose
18+
19+This is meant to serve as a backend for future turnkey Urbit appliances or IoT hubs by providing a collection of scripts, config files, and supporting infrastructure to enable the generation of custom Armbian Linux images with Urbit ready to run as service out of the box.
20+
21+### Background & Motivation
22+
23+![Bromeliaceae on a tree, Costa Rica (Atlantic area)](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Bromeliaceae20020312.JPG/640px-Bromeliaceae20020312.JPG)
24+
25+*“An epiphyte uses a tree for physical support but does not drawn nourishment from it.”*
26+
27+I’ve been running Urbit on various ARM powered devices since November 2019 and have seen Urbit on ARM evolve from a curious toy into a viable platform for daily Urbit usage, ready to be used on the cloud or a credit card sized microserver hidden in the corner of a room.
28+
29+As Urbit has matured, the flaws with some of those credit card sized devices have become increasingly apparent. On the dominant platform, the Raspberry Pi, the default 32-bit software and limited storage interfaces have made running Urbit on them sometimes difficult even for the hardy explorers that Urbit attracts.
30+
31+Urbit is often explained as an “overlay OS” but this term encourages an idealism that neglects the importance of what is underneath Urbit. A more complete term might be “epiphyte OS”, which prompts thoughts about what is supporting Urbit and allowing it to reach its heights.
32+
33+In order for Urbit to thrive on small, cheap, and locally hosted devices a more solid foundation needs to be built, one that will allow for flexible experimentation with devices bought for the purpose of running Urbit - not just some neglected Raspberry Pi pressed into service on a whim.
34+
35+This is a first attempt at building such a base.
36+
37+### Implementation
38+
39+This is a package of scripts and configuration files intended to be used in a userpatches overlay for Armbian. Though deliverables include an image intended for a particular device (the NanoPi M4V2) the advantage of Armbian over other methods of creating an embedded Linux image is the ease of targeting a diverse set of devices without time consuming setup.
40+
41+It should be possible to take this overlay and use it with the [Armbian build tool](https://github.com/armbian/build) to create Urbit ready images for about [38 different platforms](https://docs.google.com/document/d/e/2PACX-1vRo8VKU4oUQQN9Z94vu2lYP2iSb75MRwKLtLGnfTkShmUw7kupjg1cYOryT1Tw1lwczw2Eu8nyIlfKQ/pub) with little or no modification.
42+The scripts and configuration files that provide the turnkey Urbit functionality should be universally applicable to most Linux distributions with udev and systemd, and can be installed separately or integrated into other embedded Linux images.
43+
44+Core functionality will be handled by a service which runs at boot:
45+- It waits for the insertion of a USB drive, and when one is automatically mounted checks for the presence of an Urbit keyfile and an extremely basic wifi configuration file (for users who don’t want to use the bluetooth setup method for wifi).
46+- The script will configure the wifi device if a wifi file was found
47+- On finding a keyfile it will check for the presence of an already booted Urbit and will not proceed if one is found.
48+- If there’s no pre-existing Urbit, it will check for a more recent version of both Urbit binaries and its own script and system configuration packages, updating if necessary.
49+- Handoff to a monitor script, start the boot of the Urbit, and also pipe the output to a tty device for low level debug.
50+- Monitor script watches the boot process, reporting on progress to a file which can be used by a higher level frontend to display basic status and common errors (e.g. failed to contact ethereum node, failed to download boot pill, keyfile invalid).
51+- Upon successful completion of the boot process, run the Urbit service.
52+
53+Outside infrastructure for this is an APT repository to hold the most up-to-date AArch64 versions of Urbit and other packages required to enable turnkey functionality.
54+
55+Armbian image to additionally include:
56+- [RPi-Monitor](https://github.com/XavierBerger/RPi-Monitor) for real time monitoring
57+- nymea-networkmanager for [wifi configuration over bluetooth](https://berrylan.org)
58+
59+### Deliverables
60+
61+An image file ready to flash to a device (I’ve chosen the NanoPi M4V2) and the files used to generate it, published in a [github repository](https://github.com/botter-nidnul/userpatches). Service and script files will be published in a [separate repository](https://github.com/botter-nidnul/urbit-scripts), with additional repositories for the deb package control files and scripts for building the [urbit](https://github.com/botter-nidnul/urbit.deb) and [urbit-scripts](https://github.com/botter-nidnul/urbit-scripts.deb) .deb packages.
62+
63+Finally, a rough example of a rudimentary frontend will be demonstrated in a blog post style write-up with screenshots/pictures/videos as necessary to illustrate: the process of creating an image with the Armbian build tool, flashing it to a device, and the device giving information to the user about the process of starting Urbit and where to access landscape after the boot finishes.
64+
65+### Basis for future integration
66+
67+This is meant to be the start of a Linux distribution designed for self-hosted Urbit devices, but which provides more than just Urbit.
68+
69+It has the potential to evolve into a system that makes it easier for users to self host their own S3 buckets with MinIO, run IoT gateways on the device which can communicate with Urbit, and help with the setup of a local bitcoin node.
70+
71+The development of this backend will support UX experiments with a frontend meant to create a user friendly, turnkey-style Urbit device.
72+
73+
74+## Milestones
75+
76+
77+### An Armbian userpatches overlay for Urbit
78+1 stars
79+Overlay with scripts and services integrated, used to create an image for installation to a device, which will setup Urbit upon being booted.
80+
81+
82+### Demo of image generation and boot
83+1 stars
84+Blog style write-up of how to create an image with the Armbian build tool, flashing it to a device, and how it might work with a simple frontend to communicate with the user.
85+
86+
content/grants/urbit-api-for-elixir.mdnew file+38
@@ -0,0 +1,38 @@
1++++
2+title = "Urbit API for Elixir"
3+date = 2021-02-11
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "A proposal to build an Urbit HTTP Api for the Elixir language, bringing to Urbit its state of the art concurrency capabilities."
10+reward = 3
11+assignee = "mirtyl-wacdec"
12+id = "2126792953"
13+completed = false
14+link = ""
15++++
16+
17+Elixir is an increasingly popular language with state of the art concurrency, based on the Erlang BEAM VM, and it's also a functional language with one of the most attractive syntaxes out there.
18+
19+I am a web developer fluent in Ruby, JS, and working mainly with elixir for the last 5 years. I am also an Urbit user since 2019, and have already built small apps using the Urbit HTTP API to automate some tasks on my groups. I am very excited to build a full API and bring the whole functionality of the BEAM to the Urbit community.
20+
21+## Milestones
22+
23+
24+### Basic HTTP Interface
25+1 stars
26+Enabling a basic interface to send/receive json to a running Urbit ship.
27+
28+
29+### Graph Store
30+1 stars
31+Enabling full interactivity with the graph-store HTTP endpoints.
32+
33+
34+### Other Gall Apps
35+1 stars
36+Reach all available endpoints for other Gall apps such as hark-store, metadata-store, etc.
37+
38+
content/grants/urbit-community-concierge-east-coast-2q2021.mdnew file+35
@@ -0,0 +1,35 @@
1++++
2+title = "Urbit Community Concierge - East Coast - 2Q2021"
3+date = 2021-04-27
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Provide concierge service assisting new users in the Urbit Community Group"
10+reward = 1
11+assignee = "tocrex"
12+id = "427340266"
13+completed = false
14+link = ""
15++++
16+
17+Provide concierge service assisting new users in the Urbit Community Group, particularly the General, Watercooler, Help, and Community Formation channels. Identify yourself periodically as a support resource on these channels so that users know they can ask questions of you. Using a nickname could be helpful here.
18+
19+Applicants should:
20+
21+- know the "big picture" of Urbit well.
22+- be able to answer general questions about the structure and purpose of Urbit and Landscape.
23+- keep up with community and be able to recommend public groups, events, people to connect with, etc.
24+- have general information available (FAQ, Eth/gas prices, Urbit documentation, etc.)
25+- encourage and help new members to start a new group and publicize it in the Directory
26+- send a weekly digest email to mike@urbit.org, with a report of key events, most frequently asked questions, and hours worked
27+
28+## Milestones
29+
30+
31+### Complete 240 hours of concierge service
32+1 stars
33+Complete 12 weeks, 5 days/week, 4 hours/day of concierge service in the UC group
34+
35+
content/grants/urbit-community-concierge-east-coast.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "Urbit Community Concierge - East Coast"
3+date = 2021-02-10
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Provide concierge service assisting new users in the Urbit Community Group"
10+reward = 1
11+assignee = "tocrex"
12+id = "928966814"
13+completed = false
14+link = ""
15++++
16+
17+Provide concierge service assisting new users in the Urbit Community Group, particularly the General, Watercooler, Help, and Community Formation channels. Identify yourself periodically as a support resource on these channels so that users know they can ask questions of you. Using a nickname could be helpful here.
18+
19+Applicants should:
20+- know the "big picture" of Urbit well.
21+- be able to answer general questions about the structure and purpose of Urbit and Landscape.
22+- keep up with community and be able to recommend public groups, events, people to connect with, etc.
23+- have general information available (FAQ, Eth/gas prices, Urbit documentation, etc.)
24+- encourage and help new members to start a new group and publicize it in the Directory
25+- send a weekly digest email to support@urbit.org, with a report of key events, most frequently asked questions, and hours worked
26+
27+## Milestones
28+
29+
30+### 80 hours of concierge service
31+1 stars
32+Provide concierge service for 4 hours/day, 5 days/week, for 4 weeks during prime East Coast hours
33+
34+
content/grants/urbit-community-concierge-west-coast-2q2021.mdnew file+35
@@ -0,0 +1,35 @@
1++++
2+title = "Urbit Community Concierge - West Coast - 2Q2021"
3+date = 2021-04-27
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Provide concierge service assisting new users in the Urbit Community Group"
10+reward = 1
11+assignee = "~sibhul-soctul"
12+id = "1693084001"
13+completed = false
14+link = ""
15++++
16+
17+Provide concierge service assisting new users in the Urbit Community Group, particularly the General, Watercooler, Help, and Community Formation channels. Identify yourself periodically as a support resource on these channels so that users know they can ask questions of you. Using a nickname could be helpful here.
18+
19+Applicants should:
20+
21+- know the "big picture" of Urbit well.
22+- be able to answer general questions about the structure and purpose of Urbit and Landscape.
23+- keep up with community and be able to recommend public groups, events, people to connect with, etc.
24+- have general information available (FAQ, Eth/gas prices, Urbit documentation, etc.)
25+- encourage and help new members to start a new group and publicize it in the Directory
26+- send a weekly digest email to mike@urbit.org, with a report of key events, most frequently asked questions, and hours worked
27+
28+## Milestones
29+
30+
31+### Complete 240 hours concierge service
32+1 stars
33+Complete 12 weeks, 5 days/week, 4 hours/day concierge service during west coast hours
34+
35+
content/grants/urbit-community-concierge-west-coast.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "Urbit Community Concierge - West Coast"
3+date = 2021-02-10
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Provide concierge service assisting new users in the Urbit Community Group"
10+reward = 1
11+assignee = "~sibhul-soctul"
12+id = "669964979"
13+completed = false
14+link = ""
15++++
16+
17+Provide concierge service assisting new users in the Urbit Community Group, particularly the General, Watercooler, Help, and Community Formation channels. Identify yourself periodically as a support resource on these channels so that users know they can ask questions of you. Using a nickname could be helpful here.
18+
19+Applicants should:
20+- know the "big picture" of Urbit well.
21+- be able to answer general questions about the structure and purpose of Urbit and Landscape.
22+- keep up with community and be able to recommend public groups, events, people to connect with, etc.
23+- have general information available (FAQ, Eth/gas prices, Urbit documentation, etc.)
24+- encourage and help new members to start a new group and publicize it in the Directory
25+- send a weekly digest email to support@urbit.org, with a report of key events, most frequently asked questions, and hours worked
26+
27+## Milestones
28+
29+
30+### 80 hours of concierge service
31+1 stars
32+Provide concierge service for 4 hours/day, 5 days/week, for 4 weeks during prime West Coast hours
33+
34+
content/grants/urbit-event-series.mdnew file+90
@@ -0,0 +1,90 @@
1++++
2+title = "Urbit Event Series"
3+date = 2020-10-11
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "A series of community-focused events to create a new knowledge base for urbit.org, and help new community members learn about Urbit"
10+reward = 6
11+assignee = "~naplet-hildec"
12+id = "1751024973"
13+completed = false
14+link = ""
15++++
16+
17+Note: this project is incremental and intended to be delivered in multiple phases, as follows.
18+
19+**Phase I**
20+
21+Description: Kick off developer calls
22+
23+Timeframe: November-December 2020
24+
25+Grant requested: one star
26+
27+Additional required budget: None
28+
29+Deliverable: an introductory series of 3-4 developer calls for the Urbit community. Calls will happen weekly or biweekly and be hosted on Zoom or a similar platform. They can also be streamed to an Urbit channel, where community members can watch and post questions in real time. Each call will feature a different developer, invited to discuss a different part of the Urbit application stack, such as:
30+- Building apps using store/hook/view
31+- Graph store (Logan)
32+- Lib hook
33+- Ford Fusion (Ted)
34+- Dojo and the Urbit stack, “how does a keystroke get from the keyboard to Dojo and what protocols are involved?”
35+- Clay, core merge code
36+- Runtime, IPC protocol (Joe)
37+- APIs and building apps on Urbit
38+- Other fairly specific topics that aren’t already well-documented
39+
40+Note: the goal is to kick off an ongoing, self-sustaining event series. To that end, one of my goals will be sustainability: ensuring that everything is documented, that accounts/credentials are shared, and that others know how to organize and host these calls going forward. Another goal is that the calls result in a series of well-produced, high quality videos that can form the cornerstone of a new, community-contributed knowledge base to be hosted on the new Urbit.org.
41+
42+Scope of work: In consultation with Tlon and other community members, develop messaging for the event and finalize a list of topics and developers to speak at each call. Speak to stakeholders to understand what did and did not work with the previous round of developer calls. Announce the calls to the community, and request community feedback on topics/developers/questions. Prepare a list of questions for each call. Communicate with developers ahead of each call to prepare for the event, share a preliminary list of questions, etc. Host (emcee) each call, introducing the developer, asking questions, and relaying questions from community members. Record each call and post/share the recordings after.
43+
44+**Phase II**
45+
46+Description: Town hall
47+
48+Timeframe: December 2020
49+
50+Grant requested: two stars
51+
52+Additional required budget: 0-$2,500 (depending on software used, and whether we can send gifts to attendees)
53+Deliverable: a one-off, 2-3 hour “town hall” event that will be appropriate for both a technical and a non-technical audience. It will feature a keynote (topic to be determined, but perhaps something along the lines of “State of the Network”), a panel discussion, and two other brief talks, one of a more technical nature, one of a less technical nature (community or design). It may be hosted on Zoom, or it may be a good opportunity to test more sophisticated conference software such as Hopin. It will be more interactive than the developer calls, with a format that allows community members to chat with one another.
54+
55+Scope of work: In consultation with Tlon and other community members, finalize a list of speakers and topics. Work with the speakers to review their presentations and decks. Test and manage conferencing software, and host a “dry run” event for speakers. Host the event itself, introducing speakers, and moderating a panel discussion. Record the event, and share recordings of each talk after. Write a 2-3 page blog post recap of the event, including audio/video highlights.
56+
57+**Phase III**
58+
59+Description: UrbitCon
60+
61+Timeframe: Q1 2020
62+
63+Grant requested: three stars
64+
65+Additional required budget: $10,000-25,000, additional address space to grant to other community members who help organize and execute the event
66+
67+Deliverable: A one day virtual summit, this will be the first public Urbit conference, and we’ll aim for participation on the part of all core contributors and a large portion of the global community. It will take place over ~8 hrs, scheduled so that people in different timezones can participate live in at least a portion of the event. In addition to opening and closing keynotes, there will be 8-12 additional talks covering topics including tech, design, community, hosting, building a business on Urbit, mission + vision + values, and governance. The entire community will be invited to submit applications for a speaking slot. We’ll invite one or two guests from outside the community to deliver a keynote (examples: Riva, Balaji, E. Glen Weyl, Douglas Rushkoff, Richard Stallman, Niall Ferguson, John Gilmore, Stewart Brand). There will also be an art component, to be determined. We’ll recruit sponsors to cover as much of the cost of the event as possible.
68+
69+Scope of work: Act as project manager for the event. Consult with Tlon, community members, event staff/volunteers, and speakers to finalize event schedule and budget, and plan event logistics. Review applications for speaking slots and develop process to allocate speaking slots. Recruit guest speakers. Work with speakers to review and prepare talks and decks. Design the event agenda. Design sponsorship packages and recruit sponsors. Host and emcee event itself. Work with production company to record all talks in high definition, edit recordings, and share them after the event. Ensure that the event produces a high-quality, on-brand knowledge base of material on “all things Urbit.” Work with artist to plan the artistic component of the event. Post event recap, along with recordings.
70+
71+**Who am I?** I work full time for a blockchain project called Spacemesh in a hybrid role as a core developer, and as an evangelist/community organizer. I previously worked as an Ethereum core developer 2017-2019, and during my time working on Ethereum, I helped organize a number of community events, online and offline, around the world. I've attended dozens of technical conferences and hackathons. I also co-founded a blockchain co-working space and community based in New York and have hosted dozens of events as part of that community.
72+
73+## Milestones
74+
75+
76+### Phase I: Developer calls
77+1 stars
78+An introductory series of 3-4 developer calls for the Urbit community. See Details for more information and scope of work.
79+
80+
81+### Phase II: Town Hall
82+2 stars
83+A one-off, 2-3 hour “town hall” event that will be appropriate for both a technical and a non-technical audience. See Details for more information and scope of work.
84+
85+
86+### Phase III: UrbitCon
87+3 stars
88+A daylong virtual summit, the first public Urbit conference. See Details for more information and scope of work.
89+
90+
content/grants/urbit-explainer-video.mdnew file+34
@@ -0,0 +1,34 @@
1++++
2+title = "Urbit Explainer Video"
3+date = 2020-09-13
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "We want to make a short animated video that introduces Urbit to a wider audience."
10+reward = 2
11+assignee = "~rivpyl-sidfyl, ~minder-folden"
12+id = "1350087489"
13+completed = true
14+link = ""
15++++
16+
17+Our intention is to make a short video that can introduce Urbit to new people.
18+
19+Contrasting the original [Tlon-produced explainer](https://www.youtube.com/watch?v=M04AKTCDavc), we'd like to express a more subjective and personal side to using Urbit, making it understandable to less tech-inclined people in a concise and aesthetically attractive way.
20+
21+~minder-folden: My work leans heavily on custom scripting for my own creative projects as well as my commissioned work for clients so I'm excited to bring that skillset to Urbit. As a primarily non-technical member of the community, I want to help communicate the value I've seen first hand on the network beyond the boundaries of the tech world. Feel free to check out [my portfolio site](https://www.jonathanpritchard.me/).
22+
23+~rivpyl-sidfyl: I am experienced in video, audio and animation work.
24+I'll try my best in translating and adapting our idea to the audiovisual medium.
25+Here's a short video [reel](https://streamable.com/lpzh4s) showcasing some of my recent work.
26+
27+## Milestones
28+
29+
30+### It's Done
31+2 stars
32+We publish the finalized video, after developing a working storyboard that has been reviewed and shared with people that might add relevant perspectives to the project.
33+
34+
content/grants/urbit-http-api-for-emacs-elisp.mdnew file+38
@@ -0,0 +1,38 @@
1++++
2+title = "Urbit HTTP API for Emacs (elisp)"
3+date = 2021-01-18
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = ""
9+description = "Connecting Urbit with Emacs would enable all sorts of cool and creative apps. I'd love to be able to chat without leaving my editor."
10+reward = 3
11+assignee = "~winduc-dozser"
12+id = "1206158911"
13+completed = false
14+link = ""
15++++
16+
17+I've been poking around in Emacs to test the feasibility of this project, and I think it will work out pretty well. The biggest obstacle I found was the lack of SSE client library, but I already have a solution.
18+
19+ Milestones have been adapted from this google doc: https://docs.google.com/document/d/1no5oos_NE8LrUWz7iG9SKZMTIzruZVevZQ75nD5OHmI/edit
20+
21+## Milestones
22+
23+
24+### Basic HTTP Interface
25+1 stars
26+Implementation of the HTTP interface to send JSON to/from an Urbit ship.
27+
28+
29+### Graph Store Interface
30+1 stars
31+Implementation of graph-store interface.
32+
33+
34+### Additional Agent Interfaces
35+1 stars
36+Implementation of at least two of the following interfaces: contact-store, invite-store, group-store, and metadata-store.
37+
38+
content/grants/urbit-http-api-for-kotlin.mdnew file+37
@@ -0,0 +1,37 @@
1++++
2+title = "Urbit HTTP API for Kotlin"
3+date = 2020-10-27
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Write an urbit HTTP API (aka Airlock) for Kotlin."
10+reward = 3
11+assignee = "@nrtxrmnd"
12+id = "865786150"
13+completed = false
14+link = ""
15++++
16+
17+This proposal project will produce urbit HTTP API in Kotlin language with [these requirements](https://docs.google.com/document/d/1no5oos_NE8LrUWz7iG9SKZMTIzruZVevZQ75nD5OHmI/edit) in mind.
18+
19+
20+## Milestones
21+
22+
23+### HTTP interface
24+1 stars
25+HTTP interface for sending and receiving JSON from Kotlin programs
26+
27+
28+### graph-store interface
29+1 stars
30+graph-store interface for interacting with urbit's general purpose data storage model
31+
32+
33+### agents interfaces
34+1 stars
35+metadata-store and group-store agents interfaces
36+
37+
content/grants/urbit-http-api-for-rust.mdnew file+56
@@ -0,0 +1,56 @@
1++++
2+title = "Urbit HTTP API for Rust"
3+date = 2020-12-16
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "This proposal seeks to create an API to interact with an Urbit ship over HTTP written in Rust."
10+reward = 3
11+assignee = "~mocrux-nomdep"
12+id = "1120978319"
13+completed = false
14+link = ""
15++++
16+
17+This proposal seeks to create an API to interact with an Urbit ship over HTTP written in Rust.
18+
19+Rust is becoming a very popular language due to it's speed, safety, and portability.
20+
21+**Outline**
22+
23+This proposal comprises of the three milestones as defined in this doc: https://docs.google.com/document/d/1no5oos_NE8LrUWz7iG9SKZMTIzruZVevZQ75nD5OHmI/edit
24+
25+1. Basic HTTP Interface - Responsible for sending and receiving JSON to/from an Urbit ship
26+
27+2. Graph Store Interface - Interface to the graph-store Urbit API on top of the HTTP Interface
28+
29+3. Additional Agent Interfaces - Interface to the group-store and metadata-store Gall agents
30+
31+
32+**Plan**
33+
34+While doing research/testing into the complexity of building out such a http api library, I've ended up 90% completing milestone 1. This milestone should be publicly released by the end of the week that this proposal is posted on.
35+
36+From a quick look-over, milestones 2/3 do not seem too complex either, however I am also working full-time in tandem, and so my spare dev time is limited. As such the 2nd/3rd milestones are pushed out a bit further to provide some lee-way to ensure they're delivered on time.
37+
38+
39+## Milestones
40+
41+
42+### Basic HTTP Interface
43+1 stars
44+Implementation of the HTTP Interface responsible for sending and receiving JSON to/from an Urbit ship
45+
46+
47+### Graph Store Interface
48+1 stars
49+Implementation of the interface to `graph-store`, which sits on top of the HTTP Interface
50+
51+
52+### Additional Agent Interfaces
53+1 stars
54+Implementation of the `group-store` and `metadata-store` Gall agents.
55+
56+
content/grants/urbit-http-interface-java-edition.mdnew file+69
@@ -0,0 +1,69 @@
1++++
2+title = "Urbit HTTP Interface — Java Edition"
3+date = 2020-10-20
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Core Dev"]
7+[extra]
8+image = ""
9+description = "This proposal seeks to implement an HTTP interface to an Urbit instance in Java, and also seeks to build various related tooling."
10+reward = 3
11+assignee = "~sipfyn-pidmex"
12+id = "288224550"
13+completed = false
14+link = ""
15++++
16+
17+# Urbit Interface — Java Edition
18+
19+This proposal seeks to create an API to interact with an Urbit ship over HTTP written in Java.
20+
21+One benefit of a Java implementation would be that any JVM languages (Clojure, Kotlin, etc.) that support the use of Java libraries can also make use of it.
22+
23+
24+## Outline
25+
26+This comprises three parts:
27+1. **Basic HTTP Interface** - Responsible for sending and receiving JSON to/from an Urbit ship
28+
29+2. **Graph Store Interface** - Interface to the `graph-store` Urbit API on top of the HTTP Interface
30+
31+3. **Additional Agent Interfaces** - Interface to the `group-store` and `metadata-store` Gall agents
32+
33+
34+In addition, we will seek to document the code throughout the evolution of the proposal, providing READMEs along the way.
35+
36+
37+## Plan
38+
39+1. Study existing implementations and documentation
40+2. Create smallest initial working product for each milestone
41+3. Test it out with more experienced Urbit developers
42+4. Finalize and write documentation
43+
44+
45+Qualifications:
46+
47+I'm qualified to implement this because I am experienced with Java. I have used Java for 3+ years, written robotics code using Java, and have experience using the Gradle build system.
48+
49+ My github profile is at https://github.com/ynx0, where I have written software projects in other languages, such as a parser/interpreter combo for a fantasy assembly language.
50+
51+
52+## Milestones
53+
54+
55+### Basic HTTP Interface
56+1 stars
57+Implementation of the HTTP Interface responsible for sending and receiving JSON to/from an Urbit ship
58+
59+
60+### Graph Store Interface
61+1 stars
62+Implementation of the interface to `graph-store`, which sits on top of the HTTP Interface
63+
64+
65+### Additional Agent Interfaces
66+1 stars
67+Implementation of the `group-store` and `metadata-store` Gall agents
68+
69+
content/grants/urbit-http-library-for-ruby.mdnew file+39
@@ -0,0 +1,39 @@
1++++
2+title = "Urbit HTTP Library for Ruby"
3+date = 2020-11-05
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Dev Tool"]
7+[extra]
8+image = ""
9+description = "Create a Ruby language HTTP library to connect to Urbit."
10+reward = 3
11+assignee = "~winter-paches"
12+id = "227255220"
13+completed = false
14+link = ""
15++++
16+
17+Patterned per document:
18+https://docs.google.com/document/d/1no5oos_NE8LrUWz7iG9SKZMTIzruZVevZQ75nD5OHmI/edit.
19+
20+I am a long-time (20+ years) ruby coder and would love to take this on. I tried my best to ballpark the timeframe off the code I have seen as well as the fact that I still have an pretty full day job. ;) I am open to discussion on the timeframe(s) if it is too long.
21+
22+## Milestones
23+
24+
25+### Basic HTTP Interface
26+1 stars
27+This involves building a mechanism for sending and receiving JSON to/from an Urbit ship.
28+
29+
30+### Graph Store Interface
31+1 stars
32+Using the basic HTTP interface referenced above, create an interface to graph-store.
33+
34+
35+### Additional Agent Interfaces
36+1 stars
37+Landscape gall agents that can be interfaced with over the HTTP interface. I will implement at least group-store and contact-store. Time permitting I will also try invite-store and/or metadata-store.
38+
39+
content/grants/urbit-lfs-filehosting.mdnew file+68
@@ -0,0 +1,68 @@
1++++
2+title = "Urbit LFS - filehosting"
3+date = 2021-03-11
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Share large files"
10+reward = 4
11+assignee = "tabnus-fondeg"
12+id = "1736585775"
13+completed = false
14+link = ""
15++++
16+
17+## Vision
18+
19+Allow Urbit to be a personal cloud storage interface. Upload files/images to a provider and share links with chats. A technical user can be their own provider.
20+
21+
22+## Design
23+
24+A provider is a ship running the lfs-provider gall app that is paired with an http fileserver. A client is a ship running the lfs-client gall app.
25+
26+A provider can limit clients to %kids, specific groups, or manual lists of authorized ships. A client can subscribe to multiple providers.
27+
28+When a client requests an upload, the provider verifies permissions and file storage limits, and returns a one-time upload url to the fileserver.
29+
30+When the uploading is finished, the fileserver notifies the provider to update client storage usage.
31+
32+## Me
33+
34+I'm an experienced functional programmer, but amateur hooner. I've read through the Urbit hoon docs, and the GitHub Gall Guide, and I'm starting to appreciate the odd martian soil. I want to try building something real and practical on the platform. I want to run a personal fileserver with my Urbit instead of emailing files and moving USBs.
35+
36+After completing an exploratory proof-of-concept, this proposal replaces https://grants.urbit.org/proposals/1760204192 with more detailed project milestones.
37+
38+## Milestones
39+
40+
41+### Proof of concept
42+1 stars
43+Client – Proivder – Fileserver
44+
45+Client subscribes to a provider, and pokes to request an upload. Provider creates an upload url on the fileserver, and passes it to the client.
46+
47+
48+### Upload limits
49+1 stars
50+Provider tracks uploaded files per client and enforces filesize limits based on groups, %kids, list of ships. Clients store limits locally as well.
51+
52+Fileserver confirms upload to provider
53+
54+
55+### Handle Errors
56+1 stars
57+When any of the servers shutdown, a transaction is either canceled or can be resumed from a checkpoint.
58+
59+Provider can import/export the map from ship to uploaded files to prevent data loss.
60+
61+
62+### Permissions and demo UI
63+1 stars
64+The fileid gives permission to delete the file on the fileserver. Create and manage share-links using fileid. Provider can throttle file requests.
65+
66+Demo html/javascript UI for client to manage files.
67+
68+
content/grants/urbit-online-meetup.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Urbit online meetup."
3+date = 2020-06-08
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "I teach a Python class online. Many students would be interested in learning about Urbit too. I'd give a lecture and help them host planets."
10+reward = 1
11+assignee = "~fonnyx-nopmer"
12+id = "1672069956"
13+completed = true
14+link = ""
15++++
16+
17+I teach a Python class over Discord to a few friends of mine. Many of them are in unfortunate financial circumstances, and I feel like a programming job is a good way to escape that (much as it helped me). A few of them have asked me about Urbit already, so I think that there is a good amount of interest.
18+
19+I would give a lecture or two on Urbit, specifically what it is about the platform that appeals to me. I would then help them though the process of spawning and booting a planet. I would perhaps also even host the planets on a VPS. I would follow up with them afterwards to see that they are not having any issues.
20+
21+Ultimately, it might be nice to move the community over to an Urbit group. The text chat and class transcripts could be hosted there. I would model this closely on Hooniverse, as I think they do that sort of thing very well.
22+
23+## Milestones
24+
25+
26+### Urbit Lecture
27+1 stars
28+The Urbit lecture, given by me, as described.
29+
30+
content/grants/urbit-react-cookbook.mdnew file+46
@@ -0,0 +1,46 @@
1++++
2+title = "Urbit React Cookbook"
3+date = 2021-04-10
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Provide concrete examples of React UI driven by @urbit/http-api to quickly start building on top of Urbit"
10+reward = 3
11+assignee = "~witfyl-ravped"
12+id = "1312404336"
13+completed = false
14+link = ""
15++++
16+
17+The React Cookbook will create a single source of best practices for Urbit development in React through a series of simple examples. The guide will focus on implementing the new @urbit/http-api library to interface with custom Gall apps as well as common calls to backend foundations, particularly graph-store.
18+
19+The goal is to demonstrate the ease with which React can be used for the frontend of Urbit applications. While these tools are publicly available there isn’t a single source of concrete examples demonstrating their implementation. A common result is that developers spend a lot of time reading through Landscape code to reverse engineer the calls they want to make.
20+
21+Surfacing the contact points between @urbit/http-api and Hoon reveals the simple mechanics of creating frontend applications that leverage Urbit’s abilities. Work on this proposal has already proved helpful by exposing bugs in @urbit/http-api when removed from its context in Landscape. Fixing these bugs has helped streamline the process of interacting with Hoon directly from React.
22+
23+The first deliverable is a simple application demonstrating basic subscriptions, pokes, and threads to create groups, chats, add/remove users, and send and receive messages directly from a React interface. In doing so it teaches the fundamental skills required to build on top of Urbit as well as familiarizing the reader with the API’s structure, thereby helping them understand how to make other calls and leverage other data types the library offers. The second deliverable will be an example app that utilizes other social functions such as notebooks and collections.
24+
25+The first two apps will be very simple and each contained in a single file to keep basic documentation in one place. As such, there will be opportunities for additional instructions such as setting up a React environment, a deeper dive into Hooks, and leveraging things like functional components and Context Provider to help with larger, more complex apps. The third deliverable is aimed to cover these points and address supplementary needs that Tlon identifies while reviewing the first two examples.
26+
27+This guide is robust enough for a JavaScript beginner and of course more advanced developers can read from a more general perspective to grok the structure of these development techniques. While this serves Urbit by making it easy for general web developers to start building on Urbit without having to write Hoon, ideologically this guide is aligned and written with Hoon developers in mind.
28+
29+## Milestones
30+
31+
32+### First Example App: Groups and Channels
33+1 stars
34+Covering Subscriptions, Pokes, Threads, and Scries to create groups/channels, manage members, and send messages. Delivered as a merged PR into the urbit.org documentation.
35+
36+
37+### Second Example App: Advanced Functions
38+1 stars
39+Notebooks, Collections, and advanced functions not covered in the first app such as parsing mentions and code snippets from channels. Delivered as a merged PR into the urbit.org documentation.
40+
41+
42+### Breakout Lessons
43+1 stars
44+React topics for more complex apps i.e. Context Provider and advanced Hooks. Adding examples Tlon would like to see documented. Delivered as a merged PR into the urbit.org documentation.
45+
46+
content/grants/urbit-ship-and-star-hosting-and-troubleshooting-docs.mdnew file+38
@@ -0,0 +1,38 @@
1++++
2+title = "Urbit Ship and Star Hosting and Troubleshooting Docs"
3+date = 2020-08-19
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["Documentation"]
7+[extra]
8+image = ""
9+description = "User docs for ship/star owners around best practices for hosting"
10+reward = 2
11+assignee = "~dovsem-bornyl"
12+id = "1452740478"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+See: https://zalberico.com/essay/2020/06/06/urbit-on-the-cloud.html
19+
20+This proposal is for getting the above docs into the official Urbit install documentation for recommended best practices to host your own Urbit ship on digital ocean. This part should be quick since the documentation above is already written (it's just hosted on my own blog).
21+
22+Then when that's merged, to use the star from that milestone to similarly document the best practices for hosting a star and common star workflows (escaping, bridge, OTAs). This will include relevant troubleshooting commands that are helpful for someone hosting a star to debug common issues.
23+
24+All of this will be done with an eye towards maintainability of the docs along with explicit steps that make it easy for users to understand what they're doing (similar in form to the docs on blog linked above). This will also lay the ground work for potential tooling around alerting, debugging, and automation which could be described and scoped more explicitly in a future proposal once the manual processes are documented.
25+
26+## Milestones
27+
28+
29+### Add Ship Hosting To Official Urbit Docs
30+1 stars
31+The docs for running your Urbit ship in the cloud with best practices: (https://zalberico.com/essay/2020/06/06/urbit-on-the-cloud.html) will be added to the core Urbit.org documentation for users
32+
33+
34+### Star Hosting/Troubleshooting Docs
35+1 stars
36+Write up docs about the best way to host a star and ways to debug common issues/workflows. End result should be a document that explains how to go from star ownership to hosting and supporting planets
37+
38+
content/grants/verifying-urbit-id-on-keybase.mdnew file+75
@@ -0,0 +1,75 @@
1++++
2+title = "Verifying Urbit ID on Keybase"
3+date = 2020-02-19
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "Create a Gall app that links Urbit identities with Keybase."
10+reward = 2
11+assignee = "yosoyubik"
12+id = "550468262"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+Keybase is a service to aggregate multiple web2 identities and offers secure p2p messaging and file storage. Keybase assumes each ID service has multiple users.
19+In the Urbit paradigm, each Uribt ID is a self-sovereign host (personal server). Each Urbit ID is one service and one user.
20+
21+### Bounty Description
22+
23+Create a Gall app and that creates a Urbit ID based identity service and hosts an identity proof of the Urbit ID. Keybase offers a guide for creating these proofs and can be found at keybase guide for adding new services.
24+
25+##### Gall application:
26+
27+- Create an identity service for a Urbit ID
28+ - Check that the config is valid
29+- Keybase needs to check the proof periodically on the Identity Service
30+- Link on the Identity Service to the corresponding verified Keybase profile
31+- Use Urbit ID sigil as a badge (badge: a small SVG image)
32+
33+-Suggested prefilled fields:
34+- 'display_name': 'Urbit'
35+- 'Username': 'ship-name'
36+- Logo 32px black&white sigil and 16px black&white sigil
37+- 'Description': 'A clean-slate OS and network for the 21st century'
38+
39+##### User interface:
40+- Create valid `validate_proof_config.json` using form fields
41+- Binary authorization
42+ - I am ship-name on urbit [yes or no]
43+
44+### Resources:
45+- [Proof Creation](https://keybase.io/docs/proof_integration_guide#2-2-proof-creation)
46+- [Proof Checking](https://keybase.io/docs/proof_integration_guide#2-3-proof-checking)
47+- [Linking](https://keybase.io/docs/proof_integration_guide#3-linking-user-profiles)
48+
49+
50+### Prerequisites:
51+- Map your Urbit ID with a DNS domain
52+- Load an SSL certificate using acme
53+ - `:acme &path /top-level-domain/second-level-domain/optional-subdomain`
54+ - Example: `https://zod.urbit.org` --> `:acme &path /org/urbit/zod`
55+
56+### Contribution Guidelines:
57+
58+- Do not begin work until your request to claim this bounty is accepted.
59+
60+- Submit your work as a pull request to [the urbit/urbit repo](https://github.com/urbit/urbit/pulls)
61+
62+- When applying to work on the bounty, tell us a little about yourself and some projects you’ve worked on in the past.
63+
64+- You have 90 days from the time of approval to complete this bounty.
65+
66+
67+
68+## Milestones
69+
70+
71+### PR is merged
72+2 stars
73+Your work is accepted, and your PR is merged.
74+
75+
content/grants/video-content-manager.mdnew file+59
@@ -0,0 +1,59 @@
1++++
2+title = "Video Content Manager"
3+date = 2021-02-10
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["Community"]
7+[extra]
8+image = ""
9+description = "Keep your finger on the pulse of video content produced by the community, and ensure that it's made visible."
10+reward = 3
11+assignee = "~libmud-bonted"
12+id = "790269488"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+
19+A wealth of Urbit-centric content has been produced in the past several months, and we could use help with ensuring that it's aggregated and broadcasted to the greater community.
20+
21+## Responsibilities
22+
23+- Upload video content provided by Urbit Foundation and Tlon employees to the Urbit Community YouTube channel and urbit.org Media page ("channels").
24+- Organize content by type on YouTube, and possibly the Media page as well.
25+- Regularly search for Urbit-related video content and rebroadcast it from Urbit channels (with explicit permission from creators/owners).
26+- Upload audio-only content and add Urbit-related images as instructed by Tlon Design team.
27+- Keep Tlon Comms team updated when new video content is uploaded, so they can signal-boost.
28+- Coordinate (or even produce) video content creation from the community.
29+- Use Youtube as a social network to promote Urbit; link Urbit videos in the comments of video content elsewhere on YT that talks about decentralized web/web3.0, data ownership, platform failures etc.
30+
31+## Requirements
32+- Good familiarity with video recording and editing software.
33+- Previous record of participation in/knowledge of Urbit Community is a plus.
34+- Scrupulous about checking permissions/ownership of content.
35+
36+## Resources
37+
38+- [Urbit YouTube Channel](https://www.youtube.com/channel/UCNYIS9_SktINCC9yqO4CFZw/featured)
39+- [urbit.org Media Page](https://urbit.org/media/)
40+- The Tlon Comms team and Urbit Foundation will be available as resources for content direction, questions and feedback.
41+
42+## Milestones
43+
44+
45+### Bring channels up-to-date
46+1 stars
47+Wrangle content from around the web (with creators' permission) and upload it to both channels. Provide organizational structure to content—on YouTube that's creating channels/playlists, on urbit.org it's up to you.
48+
49+
50+### Ongoing maintenance
51+1 stars
52+In the three months following the first month of work, keep an eye out for additional content and upload it as needed.
53+
54+
55+### Optional: Content creation/facilitation
56+1 stars
57+Either create or directly facilitate the creation of new video/audio content (and, of course, upload it).
58+
59+
content/grants/volt-lightning-on-urbit.mdnew file+232
@@ -0,0 +1,232 @@
1++++
2+title = "volt: Lightning on Urbit"
3+date = 2021-04-02
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "An Urbit-native Lightning client and integration with `lnd` on 'provider' ships."
10+reward = 7
11+assignee = "~martyr-binbex, ~dasrun-fadben"
12+completed = false
13+link = ""
14++++
15+
16+## Introduction
17+With the coming integration of the Bitcoin wallet, Urbit ships can now send money between each other and associate payments with other ships (and soon applications/access rights). This building block will let us feel out the possibilities of inter-ship payments, but it's a time-buying measure at most: as BTC's price increases, fees will also rise, making Bitcoin impractical for payments less than around $500.
18+
19+However, the Lightning Network, built on top of Bitcoin, is rapidly advancing in functionality. It presents a unique, non-custodial solution to the high fees problem, although usability is still an issue. Urbit is perfectly positioned to take advantage of Lightning's strong points while drastically improving its useability.
20+
21+Once Lightning is integrated into Urbit, and maintained over time, Urbit will be a complete solution for building applications and receiving money for them through native payment rails.
22+
23+## Lightning Primer
24+The implementer is not expected to understand Lightning prior, but will have to do significant work to get up to speed on the protocol. What follows is a quick overview of what that entails.
25+
26+Lightning is a p2p network of nodes, which maintain "channels" between each other. Payments can then be routed from one peer to another by finding a path of channels with sufficient liquidity.
27+
28+### channels
29+A channel consists of:
30+1. an on-chain Bitcoin transaction allocating funds to one side of the channel.
31+2. subsequent signed off-chain transactions re-allocating those initial funds, that can be posted to the blockchain in the event of unresponsiveness or malfeasance of the other party.
32+
33+Peers open channels between each other in order to make payments in the network. Channels do require an on-chain transaction, but the cost of that can be mitigated as long as the side that initially doesn't have funds in the channel is willing to trust the other party. In that case, the channel can be used starting when it has zero confs, submitted to the mempool with a low fee, and becomes final once it's accepted.
34+
35+Each channel maintains a set of commitment transactions over time, which are signed IOUs that can be enforced on-chain if necessary. These must be maintained and backed up in order to secure the channel.
36+
37+### routing/payments
38+Lightning payments follow a set sequence:
39+1. payee creates an invoice
40+ - optionally with route hints ("take this path to reach me, because maybe I'm not publicly listed")
41+ - contains the hash of a secret (the "preimage")
42+2. payee sends invoice to payer
43+3. payer uses its channel graph to construct a route to payee that it thinks will work, using route hints if provided
44+4. payer tries to send payment along that route. If it fails, payer updates its channel graph and retries
45+5. all hops along the route update their commitments to the new state
46+
47+### HTLCs
48+When we say "sending payments" above, what we really mean is each hop constructing a commitment to pay the next hop if the next hop provides it the secret to the hash from the invoice in step 1.
49+
50+The contracts implementing this are called "hashed timelock contracts", or HTLCs. For more background, [this resource is recommended](https://github.com/lnbook/lnbook/blob/develop/routing.asciidoc). The basic concept is that once the final destination receives payment, it sends the secret to the prior hop, who uses it to get paid from the hop prior, and so on back to the original payer.
51+
52+### interceptors
53+Because Lightning uses onion routing, every hop along a payment path must use onion routing. In order to avoid implementing this for the last (inside Urbit) hop, we can use the [HTLC Interceptor](https://api.lightning.community/#htlcinterceptor) feature in the `lnd` RPC. This allows an `lnd` node to intercept an incoming payment request and inject its data into a new context, from which it can be handled.
54+
55+### additional resources
56+Additional background will be provided to the implementer by the Foundation as needed, and we can also arrange meetings with Lightning Labs for help as the project progresses. [Mastering the Lightning Network](https://github.com/lnbook/lnbook) is another good place to get up to speed.
57+
58+## Lightning in Urbit
59+To speed and simplify implementation, we can use Urbit networking to provide full Lightning features without needing a full Lightning node (BOLT) implementation. In effect, we bridge "outside" Lightning to "inside Urbit", "interior" Lightning.
60+
61+Throughout the architecture, we refer to "interior" nodes: Urbit nodes running a Lightning implementation that do not network with the outside Lightning world.
62+
63+### wins of this approach
64+
65+#### non-custodial *and* easy to use *and* powerful
66+Current Lightning implementations force users to pick 2 of 3: non-custodial, easy, rich/powerful. Wallets like Breez are non-custodial and easy to use, but can only do payments. Sphinx chat is more powerful, but you are forced to choose between ease and custody--if you want control over your money, you need to configure your own Lightning node.
67+
68+Lightning on Urbit is able to achieve all 3 of these properties. The key is that we implement Lightning features inside an Urbit environment, which gives full access to Urbit's programmable ids and OS. We also can use Urbit's networking to link interior ships to providers running `lnd` and connecting to the outside Lightning network. As a result, `volt` will enable much richer Lightning experiences, across a full range of applications.
69+
70+#### leverages existing Urbit features
71+Lightning has some complex networking to implement, but because Urbit already has secure routing to named destinations in Ames, we can use that. This lets the work focus on implementing payment channels in Urbit.
72+
73+#### clear upgrade paths
74+The initial architecture does make one tradeoff: interior nodes are always one hop away from their providers, and so the provider knows how much money nodes are sending and receiving. There are two ways to handle that, one immediately possible, and the other doable after an upgrade:
75+1. (ok, doable now) Nodes can upgrade to running their own providers. A busy node can configure its own `lnd` provider and connect to the Lightning network directly, while maintaining all of `volt`'s benefits in terms of integration of payments with Urbit. This is similar to the upgrade path that Sphinx chat provides, but still with non-custodial properties for users who don't take this path.
76+2. (better, doable in the future) We can implement Lightning's onion routing (not networking) in Urbit, allowing multi-hop paths within the Urbit network, with private payments *even for nodes not running lnd*.
77+
78+### blockers
79+Private key/hot wallet management inside Urbit. This is needed to sign commitment transactions. We can use dummy versions of this in development, and then figure out the best way to handle it when the rest is in place. We can't use cold wallet or external wallet signing, because commitment transactions need to be signed on demand, without manual user interaction.
80+
81+## architecture
82+`volt` consists of a “dumb” provider that bridges between `lnd` RPC calls and Urbit, and the “volt” agent that runs the Lightning protocol between interior Urbits.
83+
84+### system diagram
85+![system](https://s3.timlucmiptev.space/timluc/timluc-miptev/volt_arch.png)
86+
87+### payment flows diagram
88+![payments](https://s3.timlucmiptev.space/timluc/timluc-miptev/volt_payment_flow.png)
89+
90+### RFCs implemented
91+We implement everything related to channels, HTLCs, and invoices. We leave out all the Lightning networking and routing elements.
92+[RFCs located here](https://github.com/lightningnetwork/lightning-rfc/blob/master/00-introduction.md)
93+* RFC 02: channel opening, closing, HTLCs
94+* RFC 03: commitment transactions
95+* RFC 05: on-chain transaction handling
96+* RFC 11: invoices
97+
98+### volt-provider lib
99+Bridge between `lnd` or similar Lightning server running on the same machine as a Urbit. This could be implemented as a separate agent or as a library that `volt` uses. My recommendation would be to implement first as the latter, and split out to an agent if other agents could potentially be using it.
100+* Communicates with lnd over rpc
101+* passes HTLCs in and out
102+* accepts Hoon commands to open/close channels with outside nodes
103+
104+#### heartbeat
105+* checks for connectivity with lnd every N seconds
106+* updates local agent and subscribers with status
107+
108+#### incoming payments
109+* intercepts the HTLC
110+* injects the HTLC and metadata (next hop) into `volt`, where it's handled
111+* receives a pre-image back and sends it back to the Lightning network (which RPC call?)
112+
113+#### outgoing payments
114+* receives outgoing-payment request from itself
115+* finds an outgoing route, if one exists
116+* constructs an HTLC with the interior node
117+* sends the outgoing payment using RPC `SendPaymentV2` with params:
118+ - invoice
119+ - route hints
120+ - fee
121+* when the preimage is received, inject back into `volt` to settle the HTLC
122+
123+### volt
124+Manager for interior Lightning in Urbit. `volt` handles everything related to channel management, HTLC creation and updating, and payment recording between ships.
125+* connects to provider
126+* provides Lightning pubkey to provider
127+* maintains pubkey->Urbit ship mappings
128+* maintains channel and commitment data
129+* maintains HTLCs
130+
131+#### channels
132+* open/close channels between provider nodes and others
133+* monitor for fraud
134+* serialize and encrypt commitments for backup
135+*note on backup*: commitments are critical for maintaining a channel's security, so we need functionality to back up that state to other Urbit ships whenever it changes, to avoid issues on breaches etc.
136+
137+#### receive payment
138+* build invoice (with routing hints)
139+* send invoice to payer (can be interior or exterior)
140+* accept incoming HTLC from provider
141+* settle the HTLC if it's for us, fail otherwise
142+* update channel commitments
143+* update payment history, optionally with ship metadata
144+
145+#### send payment
146+* parse invoice from payee
147+* make sure that either
148+ - our node is our provider
149+ - we have enough capacity to our provider
150+* make a new HTLC commitment with provider (if remote provider)
151+* send payment request to provider
152+* get result from provider and settle the HTLC
153+
154+## user stories
155+### provider
156+As a provider, I can
157+* open/close channels with outside lightning nodes through the `lnd` RPC
158+* accept Urbit ships as clients and open/close channels with them
159+* intercept incoming HTLC payments for interior Lightning on my ship to handle
160+* receive settled HTLCs from the interior and inject them back into lnd to settle my exterior
161+
162+### Urbit ship
163+As an Urbit ship I can
164+* select a provider and connect to it
165+* open/close channels with my provider
166+* receive payments from Urbit users
167+* make payments to other Urbit ships
168+* make and receive payments with outside Lightning nodes
169+* view my transaction history
170+
171+## weaknesses and future upgrades
172+### weaknesses
173+As designed, the provider will see incoming and outgoing transaction flow. The best solution for that is to run your own local Lightning node. Some of upgrades below would address this flaw.
174+
175+### upgrades
176+#### multi-provider support
177+Allowing a ship to maintain channels with multiple providers would stop one provider from knowing all your transactions. This isn't super-complicated; it's just extra Hoon work that should probably be started soon after v1 is complete.
178+
179+#### Urbit-native onion routing
180+It would be great for privacy if Urbit nodes could construct paths with multiple hops from the interior that could reach the exterior. The reverse is already doable (exterior payments reach multi-hop interior Urbit nodes).
181+
182+The multi-hops going out can’t be done until lnd implements ability to forward onion blobs to the wider network and inject the received preimage back in the RPC. This would also require us to be able to build onion routing (not terribly hard, but definitely adds scope).
183+
184+#### submarine swaps
185+It is possible to re-balance channel liquidity (shifting more of the balance to one side of the channel or the other) by combining a Lightning payment with an on-chain transaction. This is outside the scope of this project, but could potentially be extremely valuable for merchants running businesses on Urbit.
186+
187+## Resources
188+* The libraries and full node interface provided by the `btc-wallet` project will be useful for parsing formats like `bech32` and for querying the state of the blockchain to monitor for cheating.
189+* [Urbit Bitcoin Wallet](https://github.com/timlucmiptev/btc-agents)
190+* [Lightning RFC](https://github.com/lightningnetwork/lightning-rfc/blob/master/00-introduction.md)
191+* [lnd RPC API](https://api.lightning.community/)
192+
193+## contributor requirements
194+* 4+ years of experience as a backend developer
195+* Full-time availablity is ideal
196+* Some familiarity with Hoon a strong positive
197+* Some programming familiarity with Bitcoin a strong positive
198+* Attend regular (weekly or bi-weekly) checkin meetings with an urbit.org director to provide status updates
199+
200+### working process
201+* The contributor will work with the Foundation coordinator to on-board fully to Lightning and Bitcoin within Urbit.
202+* After initial onboarding, the contributor will do a weekly check-in call with the coordinator, more frequently if needed/desired.
203+* The contributor will fork [this Github repo](https://github.com/urbit/volt) and submit PRs to it to get feedback.
204+
205+## Milestones
206+
207+
208+### transaction/invoice RFCs
209+2 stars
210+* Implement RFCs 2, 3 and 11 from BOLT.
211+* Create the libs and types that further stages will depend on
212+
213+
214+### on-chain transaction RFC
215+2 stars
216+* implement RFC 5, on-chain transaction handling
217+* test that channels can be opened and closed in the manner described there
218+
219+
220+### provider libraries
221+1 stars
222+* implement the `volt` provider that will talk to `lnd`
223+* create any configuration files needed to start `lnd` locally
224+
225+
226+### `volt` agent and cleanup
227+2 stars
228+* create the Gall agent to manage transactions
229+* connect it to the provider libs
230+* use the RFC libs to wire up all on-chain transactions
231+
232+
content/grants/web-scraper.mdnew file+45
@@ -0,0 +1,45 @@
1++++
2+title = "Web Scraper"
3+date = 2020-02-07
4+[taxonomies]
5+grant_type = ["bounties"]
6+grant_category = ["App Dev: Arvo"]
7+[extra]
8+image = ""
9+description = "It is often useful for archival purposes to pull down an entire website, however many sites have a complex network of pages that would be difficult to download one at a time."
10+reward = 1
11+assignee = "tug"
12+id = "1967189374"
13+completed = false
14+canceled = true
15+link = ""
16++++
17+
18+Build a web crawler that given a url will walk through all the links for that given domain and download each page, rewriting the links to be local as it goes. This web crawler should be written as a thread that writes to Clay.
19+
20+A completed app should:
21+
22+Take a url or set or urls, connect to the given url over HTTP and download each page, following links on the same domain and rewriting the links to be local as it goes. This should function like wget with the `--mirror`, `--convert-links`, and `--page-requisites` options.
23+
24+### Resources
25+
26+[wget](https://www.gnu.org/software/wget/)
27+
28+### Contribution Guidelines
29+
30+Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
31+
32+### Submit your code as a PR to the Urbit repository.
33+
34+- Do not begin work until your request to claim this bounty is accepted. We will assign a designer to work with you on the interface.
35+- Submit your code as a PR to the [urbit](https://github.com/urbit/urbit) repository.
36+- You have 45 days from the time of approval to complete this bounty.
37+
38+## Milestones
39+
40+
41+### PR is merged
42+1 stars
43+Your pull request is merged.
44+
45+
content/grants/webrtc-gall-agent-and-external-app.mdnew file+77
@@ -0,0 +1,77 @@
1++++
2+title = "WebRTC Gall Agent and external app"
3+date = 2021-01-08
4+[taxonomies]
5+grant_type = ["proposals"]
6+grant_category = ["App Dev: Other"]
7+[extra]
8+image = ""
9+description = "Add WebRTC support to Urbit, including call/stream setup and teardown messaging and ICE/STUN/TURN advertisement and authentication."
10+reward = 8
11+assignee = "Edward Amsden ~ritpub-sipsyl"
12+id = "21131866"
13+completed = false
14+link = ""
15++++
16+
17+## Overview
18+
19+Adding the ability to make encrypted media calls between Urbit ships, using only Urbit as a signalling channel, without a centralized intermediary, would provide real utility and an immediate boost in the excitement in the end user interface.
20+
21+WebRTC provides media device (camera/speaker/microphone) discovery and peer-to-peer encrypted transit of media. It is supported by all major browsers as well as libraries for many major programming languages.
22+
23+WebRTC relies on external signalling, implemented by the application developer, to handle connection negotiation and call setup and teardown.
24+
25+This creates a natural synergy with URbit, as Urbit provides a hierarchical peer-communication system between known addresses with reputation. A WebRTC Gall agent would provide a solution for coordinating real-time media communications between Urbit ships.
26+
27+## Deliverables
28+
29+### WebRTC Gall Agent
30+This will serve as the _signalling_ channel for Urbit WebRTC applications. WebRTC requires an out-of-band channel (in standard usage usually implemented as an HTTP REST API) which can receive connectivity information from peers and distribute it to peers.
31+
32+### WebRTC calling app
33+This would be an external (probably in-browser) app which would provide the initial end-user interface for
34+ - making two-way media calls
35+ - making n-way media conference calls
36+ - streaming media from one peer to many
37+
38+### ICE/STUN/Turn advertising
39+A separate Gall agent would initially allow stars to advertise ICE and STUN servers for use by sponsored planets and their moons. WebRTC depends on ICE and STUN to allow NATed and firewalled peers to negotiate peer-to-peer connections.
40+
41+The last milestone would be to add TURN advertising with authentication to this agent. TURN servers provide relay services for peers which cannot directly connect, thus they are much more expensive, especially in terms of bandwidth, than ICE and and STUN. This should permit stars to specify which planets are authorized to use the TURN server, and, in the planet instantiation of the agent, seamlessly offer this information to WebRTC and other applications using the agent.
42+
43+## Beyond
44+
45+The proposer would eventually like to see media streas themselves propagated via Urbit. To achieve this, however,
46+it would be necessary to:
47+- Create a performant method (likely a vane) for passing network messages which are not retained in the event log
48+- Significantly improve Urbit's NAT traversal and firewall hole-punching abilities to match the state of the art.
49+ (this has been discussed with, among others, ~ritfed-tabrg and ~wolref-podlex).
50+
51+## Team
52+
53+Edward Amsden ~ritpub-sipsyl is a vertan software developer and principal of Black River Software. He has spent the last 5+ years working on industrial IoT solutions in Haskell as a contractor for Plow Technologies.
54+
55+## References
56+[Mozilla Developer Network WebRTC walkthrough](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling)
57+[Dealing with connectivity](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity)
58+
59+## Milestones
60+
61+
62+### Gall agents (WebRTC, ICE/STUN)
63+2 stars
64+A Gall agent which handles exchanging SDP messages for WebRTC applications
65+Another Gall agent which handles advertising ICE and STUN servers from stars to planets
66+
67+
68+### Standalone WebRTC-via-Urbit app
69+4 stars
70+Urbit app running in browser and hosted/interfaced via Eyre which provides the three categories of calling functionality described in the body of the proposal
71+
72+
73+### Authenticated TURN advertising
74+2 stars
75+Extension of the ICE/STUN Gall agent to allow stars to advertise an authenticated TURN server to some or all of their sponsored planets. Extension of the WebRTC application to use TURN servers.
76+
77+
content/reset.md+2−2
@@ -77,8 +77,8 @@ Yes, by following these steps (note that these steps **will not** back up your d
77771. Download your [keyfile from Bridge](https://urbit.org/getting-started/#keyfile).
78782. Shut down your ship.
79793. [Archive and move your old pier](@/using/os/getting-started.md#moving-your-pier) (this is the directory that contains your urbit event log).
80−4. [Download the latest version](@/getting-started/_index.md#macos-and-linux) of the urbit binary.
81−5. [Boot your ship with the new keyfile](@/getting-started/_index.md#boot-your-planet).
80+4. [Download the latest version](@/getting-started/_index.md) of the urbit binary.
81+5. [Boot your ship with the new keyfile](@/getting-started/_index.md).
8282
8383## I’m hosted by Tlon, or someone else—what do I need to do?
8484
content/understanding-urbit/interface.md+10−10
@@ -12,9 +12,9 @@ We built Urbit OS + Urbit ID to be the software stack for human-scale computing
1212
1313This is why we built Landscape: a simple, calm, browser-based interface for building digital communities. We use Landscape to bring together our separate ways of communicating and collaborating.
1414
15−Landscape isn’t just an idea—it’s a real thing. Today, once you have an Urbit OS node up and running, you can access Landscape from a desktop or mobile browser to pseudonymously chat, write, and share links with a group of friends.
15+Landscape isn’t just an idea—it’s a real thing. Today, once you have an Urbit OS node up and running, you can access Landscape from a desktop or mobile browser to pseudonymously chat, write, and share links with a group of friends.
1616
17−We see Landscape as a new form of social software that can continue to grow and evolve for quite some time. We use the first version of Landscape, ‘OS 1’ every day. OS 1 is simple to the point of being simplistic. We look forward to evolving Landscape for a long time.
17+We see Landscape as a new form of social software that can continue to grow and evolve for quite some time. We use the first version of Landscape, ‘OS 1’ every day. OS 1 is simple to the point of being simplistic. We look forward to evolving Landscape for a long time.
1818
1919Landscape is by no means the only possible interface for Urbit OS + Urbit ID, but it’s the one that we need the most. In the future, we look forward to there being lots of different Urbit interfaces (and if you’re at all interested in experimenting with building one, please do.)
2020
@@ -31,11 +31,11 @@ Above all else, our digital lives today are missing a sense of place, a sense of
3131
3232It’s annoying and confusing to switch between interfaces, you can’t extend or build on top, and privacy and security are out of your hands. This fragmented, siloed, closely surveilled experience is simply a byproduct of having other people run and control your software. For the ordinary user, the result is restrictive, boring, and painful to manage. The possibility for everyday creativity with the tools we’re stuck with is close to zero. Wasn’t the computer supposed to be a bicycle for the mind?
3333
34−Operating systems for the PC took the desk of the 1970s and made it digital. Paper, drawers, and envelopes became ‘files’ and ‘folders’. It’s a great abstraction, but it’s ancient. We live in a connected, multiplayer world; we need an operating system that acknowledges this world.
34+Operating systems for the PC took the desk of the 1970s and made it digital. Paper, drawers, and envelopes became ‘files’ and ‘folders’. It’s a great abstraction, but it’s ancient. We live in a connected, multiplayer world; we need an operating system that acknowledges this world.
3535
3636The ‘desk’ of today is cluttered with apps and services, data structures, and interfaces. Unifying this disjointed user experience is the most important problem that a platform like Urbit can solve. Landscape is built to bring everything together into a unified interface again. Without Urbit ID + Urbit OS, this would be impossible.
3737
38−In March 2020 we shipped the first public version of Landscape, OS 1, to the network and have been using it ever since to communicate, collaborate, and keep in touch.
38+In March 2020 we shipped the first public version of Landscape, OS 1, to the network and have been using it ever since to communicate, collaborate, and keep in touch.
3939
4040OS 1 is a minimal, multipurpose interface for bringing a group together to chat, share links, write and engage in discussion. OS 1 is free of any ads, tracking, or surveillance (as is the norm for anything built on Urbit). OS 1 is a stripped-down social utility designed for high-trust, direct communication and collaboration. OS 1 is the place for small communities to feel at home.
4141
@@ -43,7 +43,7 @@ OS 1 is a minimal, multipurpose interface for bringing a group together to chat,
4343
4444We built OS 1 for ourselves. We were sick of using centralized, mainstream software. We didn’t want to be stuck switching between bloated, monolithic services in order to keep in touch and move our work forward. We were done relying on some third party to take care of our community—so we exited to Urbit, and it feels good.
4545
46−If you’re curious to get a complete overview of OS 1, check out [this post](https://urbit.org/blog/introducing-os1/), watch the [release event](https://www.youtube.com/watch?v=71ViyftPkGk&feature=youtu.be&t=3963) or feel free to [boot a node](@/getting-started/_index.md#comet) to come talk to us.
46+If you’re curious to get a complete overview of OS 1, check out [this post](https://urbit.org/blog/introducing-os1/), watch the [release event](https://www.youtube.com/watch?v=71ViyftPkGk&feature=youtu.be&t=3963) or feel free to [boot a node](@/getting-started/_index.md) to come talk to us.
4747
4848(Running Urbit still requires a little fiddling around in the command-line, so it’s not for everyone—but we do have [plans for that to improve](https://urbit.org/blog/providers/).)
4949
@@ -51,21 +51,21 @@ Our target with OS 1 was to produce the [Nokia 3310](https://en.wikipedia.org/wi
5151
5252<img class="ba" src="https://storage.googleapis.com/media.urbit.org/site/understanding-urbit/uu-interface-4.png">
5353
54−Landscape has two basic building blocks: groups and modules. A group is exactly what it sounds like: one or more people. A module is sort of like an app without the data lock-in. A module is just a tool for getting something done, like ‘tasks’, ‘links’ or ‘votes’ that’s shared by a group.
54+Landscape has two basic building blocks: groups and modules. A group is exactly what it sounds like: one or more people. A module is sort of like an app without the data lock-in. A module is just a tool for getting something done, like ‘tasks’, ‘links’ or ‘votes’ that’s shared by a group.
5555
56−To give a few simple examples, a group of family members may just chat and share photos. A group of traders might share annotated research, watch the markets, and manage payments on a blockchain.
56+To give a few simple examples, a group of family members may just chat and share photos. A group of traders might share annotated research, watch the markets, and manage payments on a blockchain.
5757
58−Today, Landscape only has a few modules that come out of the box: chat, links, and publish. Our plan is to keep expanding this suite such that the default suite of modules feels like a nicely balanced toolkit for building community and staying connected. We’d also like to make it easy for anyone to build their own module and share it with others directly over Urbit’s network.
58+Today, Landscape only has a few modules that come out of the box: chat, links, and publish. Our plan is to keep expanding this suite such that the default suite of modules feels like a nicely balanced toolkit for building community and staying connected. We’d also like to make it easy for anyone to build their own module and share it with others directly over Urbit’s network.
5959
6060The idea is this: any community should be able to customize their digital environment freely. For most users, this is just about choosing the right modules. For anyone with a bit of free time, adding your own modules should only be as difficult as building a simple webapp.
6161
62−When we look forward to what we can do with Landscape in the future, it’s hard to see ourselves going back to the tools we use today. The centralized services we have now are like broadcast media: they’re for distributing content from a producer to a bunch of followers.
62+When we look forward to what we can do with Landscape in the future, it’s hard to see ourselves going back to the tools we use today. The centralized services we have now are like broadcast media: they’re for distributing content from a producer to a bunch of followers.
6363
6464Landscape is for everything else. Landscape is for actual two-way communication.
6565
6666<img class="ba" src="https://media.urbit.org/site/understanding-urbit/your-last-computer/your-last-computer-waves%402x.png">
6767
68−Our desire to build a single place to work together isn’t driven just by convenience
68+Our desire to build a single place to work together isn’t driven just by convenience
6969(although it is quite convenient). The way we see it, [real communities need to have real ownership over the spaces they inhabit](https://urbit.org/blog/urbit-is-for-communities/). When communities use industrial-grade, one-size-fits-all software they feel as sterile as the software they use. That world always felt a bit like living in a planned community. We’d rather live in the countryside.
7070
7171We think Landscape can evolve into something even *more* powerful, cleaner, and more satisfying to use. Landscape is neither a social network nor productivity software. Landscape isn’t centrally controlled or passively surveilled. Landscape is something entirely new. It’s software that’s tailored to the people who use it, by the people who use it.
content/updates/2018-2-17-update.md+2
@@ -3,6 +3,8 @@ title = "~2018.2.17 Update"
33date = 2018-02-17
44description = "A short update from the Tlon team for the week of ~2018.2.17."
55aliases = ["/posts/2018-2-17-update/"]
6+[taxonomies]
7+post_type = ["gifts"]
68[extra]
79ship = "~tonlur-sarret"
810author = ""
content/using/id/guide-to-breaches.md+2−2
@@ -34,7 +34,7 @@ personal breach, follow the steps below.
3434- Download your new keyfile following these instructions: [Generate your
3535 keyfile](@/using/id/using-bridge.md#generate-your-keyfile).
3636- Delete or archive your old [pier](@/docs/glossary/pier.md).
37−- Proceed to [boot your ship](@/getting-started/_index.md#boot-your-planet) with the new keyfile.
37+- Proceed to [boot your ship](@/getting-started/cli.md#boot-your-planet) with the new keyfile.
3838- Delete your keyfile after successfully booting.
3939- Rejoin your favorite chat channels and subscriptions.
4040
@@ -57,7 +57,7 @@ you are transferring to another address you own. The process here is slightly di
5757 keyfile](@/using/id/using-bridge.md#generate-your-keyfile). The option
5858 whether or not to breach is in the Accept your Transfer step.
5959- Delete or archive your old [pier](@/docs/glossary/pier.md).
60−- Proceed to [boot your ship](@/getting-started/_index.md#boot-your-planet) with the new keyfile.
60+- Proceed to [boot your ship](@/getting-started/cli.md#boot-your-planet) with the new keyfile.
6161- Delete your keyfile after successfully booting.
6262- Rejoin your favorite chat channels and subscriptions.
6363
content/using/os/ship-troubleshooting.md+1−1
@@ -38,7 +38,7 @@ When you first start your ship, you should make sure you put it a place where yo
3838
3939### Keep up-to-date builds
4040
41−Check for latest Urbit version at https://github.com/urbit/urbit/releases. If you're behind, update using [this guide](@/getting-started/_index.md#updating).
41+Check for latest Urbit version at https://github.com/urbit/urbit/releases. If you're behind, update using [this guide](@/getting-started/cli.md#updating).
4242
4343### `|hi` your star to see if you're connected
4444
sass/_main.scss+11−8
@@ -607,6 +607,9 @@ iframe.arena-iframe {
607607 position: relative;
608608 padding-bottom: 56.25%;
609609 padding-top: 30px; height: 0; overflow: hidden;
610+ &.index {
611+ padding-bottom: 14.25rem;
612+ }
610613}
611614
612615.video-container iframe,
@@ -670,27 +673,27 @@ h1, h2, h3, h4, h5, h6 {
670673 border-bottom-style: none;
671674 }
672675}
673−
676+
674677 .yellow2-new {
675678 color: #FFC700;
676679 }
677−
680+
678681 .bg-yellow3-new {
679682 background-color: #D7AC14;
680683 }
681−
684+
682685 .yellow3-new {
683686 color: #D7AC14;
684687 }
685−
688+
686689 .bg-yellow3-faded {
687690 background-color: rgba(#D7AC14,0.05);
688691 }
689−
692+
690693 .bg-gray7 {
691694 background-color: #EFEEEC;
692695 }
693−
696+
694697 .gray8 {
695698 color: #bfbebd;
696699 }
@@ -708,5 +711,5 @@ h1, h2, h3, h4, h5, h6 {
708711 background-size: 100%;
709712 background-repeat: no-repeat;
710713 }
711− }
712−
714+ }
715+
sass/_responsive.scss+12−2
@@ -11,10 +11,20 @@
1111 }
1212}
1313
14+@media screen and (max-width: 46.874em) {
15+ .community {
16+ grid-template-columns: 1fr;
17+ grid-template-rows: repeat(1fr);
18+ }
19+ #hero {
20+ background-blend-mode: soft-light;
21+ }
22+}
23+
1424// custom L breakpoint classes
1525@media screen and (min-width: 46.875em) and (max-width: 60em) {
16− .white-l {
17− color: #fff;
26+ .white-l {
27+ color: #fff;
1828 }
1929}
2030
static/detect.jsnew file+26
@@ -0,0 +1,26 @@
1+if (document.body.classList.contains("index")) {
2+ let download = document.getElementById("download");
3+ let downloadDiv = document.getElementById("download-div");
4+ let downloadInfo = document.getElementById("download-info");
5+
6+ let curOS = "";
7+ if (navigator.appVersion.indexOf("Win")!=-1) curOS="Windows";
8+ if (navigator.appVersion.indexOf("Mac")!=-1) curOS="MacOS";
9+ if (navigator.appVersion.indexOf("Linux")!=-1) curOS="Linux";
10+
11+ if (curOS === "Windows") {
12+ let newInfo = document.createElement("span");
13+ newInfo.textContent = "Coming soon for Windows";
14+ downloadDiv.removeChild(downloadInfo);
15+ downloadDiv.appendChild(newInfo);
16+ }
17+
18+ if (curOS === "Linux") {
19+ let newInfo = document.createElement("span");
20+ newInfo.classList = "mono";
21+ newInfo.textContent = "sudo snap install port";
22+ downloadDiv.classList = "bg-gray1 white br2 pv2 ph3 dib";
23+ downloadDiv.removeChild(downloadInfo);
24+ downloadDiv.appendChild(newInfo);
25+ }
26+}
static/scripts.js+14−10
@@ -344,6 +344,19 @@ let docsNavScroll = function () {
344344 }
345345}
346346
347+if (document.body.classList.contains("index")) {
348+ tippy('.tooltip', {
349+ content(reference) {
350+ const title = reference.getAttribute('title')
351+ reference.removeAttribute('title')
352+ return title
353+ },
354+ animateFill: false,
355+ animation: 'fade',
356+ placement: 'bottom'
357+ })
358+}
359+
347360if (window.location.href.includes("docs")) {
348361 // tooltip behaviour for standard library page
349362 tippy('.tooltip', {
@@ -453,13 +466,4 @@ if (document.body.classList.contains("page-indiced") || document.getElementById(
453466 parents.forEach(current => current.classList.add('current'));
454467 }
455468 })
456−};
457−
458−let oceanvid = document.getElementById("ocean");
459−
460−if ((oceanvid !== null) && (window.innerWidth > window.innerHeight)) {
461− oceanvid.innerHTML = `<source
462− src="https://media.urbit.org/site/sea30-1440.mp4"
463− type="video/mp4"/>
464− Your browser does not support the video tag.`
465−}
469+};
templates/base.html+3−3
@@ -30,12 +30,11 @@
3030 <style type="text/css">
3131 /* Mailchimp style overrides */
3232 #mc_embed_signup{clear:left; width:100%;}
33− {% block templatestyles %} {% endblock templatestyles%}
33+ {% block templatestyles %} {% endblock templatestyles %}
3434 </style>
3535 <link rel="stylesheet" href="/indigo.css">
3636 <link rel="stylesheet" href="/styles.css">
3737 <!-- END CSS -->
38−
3938 <!-- START MATOMO -->
4039 <script type="text/javascript">
4140 var _paq = window._paq || [];
@@ -61,6 +60,7 @@
6160 {% include "partials/search-overlay.html" %}
6261 {% block content %}
6362 {% endblock content %}
63+ <script type="text/javascript" src="/detect.js"></script>
6464 {% if config.build_search_index %}
6565 <script type="text/javascript" src="{{ get_url(path="glossary.js") | safe }}"></script>
6666 <script type="text/javascript" src="{{ get_url(path="elasticlunr.min.js") | safe }}"></script>
@@ -68,6 +68,6 @@
6868 <script src="https://unpkg.com/popper.js@1"></script>
6969 <script src="https://unpkg.com/tippy.js@4"></script>
7070 {% endif %}
71− <script src="{{ config.base_url }}/scripts.js"></script>
71+ <script src="/scripts.js"></script>
7272 </body>
7373</html>
templates/grant_category/list.htmlnew file+1
@@ -0,0 +1 @@
1+{% extends "taxonomy/list.html" %}
templates/grant_category/single.htmlnew file+36
@@ -0,0 +1,36 @@
1+{% extends "base.html" %}
2+{% import "macros/macros.html" as macros %}
3+
4+{% block title %}
5+ <meta name="og:title" content="Grants - {{ config.title }}">
6+ <title>Grants - {{ config.title }}</title>
7+{% endblock title %}
8+
9+{% block description %}
10+ <meta name="og:description" content="Grants facilitated by the Urbit Foundation.">
11+ <meta name="description" content="Grants facilitated by the Urbit Foundation.">
12+{% endblock description %}
13+
14+{% block content %}
15+<!-- header -->
16+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl fixed-xl">
17+ <a class="gray3" href="/">Urbit</a>
18+ <span class="gray3"> / </span>
19+ <a class="gray3" href="/grants/">Grants</a>
20+ <span class="gray3"> / </span>
21+ <a href="{{ current_url }}">{{ term.name | capitalize }}</a>
22+
23+ {% include "partials/navigation-search.html" %}
24+
25+</nav>
26+<section class="full c4-12-lg pt4">
27+
28+ <h1 class="mb4">{{ term.name | capitalize }} Grants</h1>
29+
30+ {% for page in term.pages %}
31+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
32+ {% endfor %}
33+
34+</section>
35+{% include "partials/footer.html" %}
36+{% endblock content %}
templates/grant_type/apprenticeships.htmlnew file+81
@@ -0,0 +1,81 @@
1+{% extends "base.html" %}
2+
3+{% import "macros/macros.html" as macros %}
4+
5+{% block title %}
6+<meta name="og:title" content="Apprenticeships Archive - {{ config.title }}">
7+<title>Apprenticeships - {{ config.title }}</title>
8+{% endblock title %}
9+
10+{% block description %}
11+<meta name="og:description" content="Urbit Apprenticeships Archive">
12+<meta name="description" content="Urbit Apprenticeships Archive">
13+{% endblock description %}
14+
15+{% block image %}
16+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
17+{% endblock image %}
18+
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 %}
26+
27+<!-- header -->
28+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
29+ <a class="gray3" href="/">Urbit</a>
30+ <span class="gray3"> / </span>
31+ <a class="gray3" href="/grants">Grants</a>
32+ <span class="gray3"> / </span>
33+ <a href="{{ current_url }}">Apprenticeships</a>
34+ {% include "partials/navigation-search.html" %}
35+</nav>
36+<!-- content -->
37+<section class="full c4-10-lg pt4 lh-copy">
38+ <h1>Apprenticeships</h1>
39+ <p>
40+ We often get inbound inquiries that go something like: "I'm somewhat
41+ familiar with Hoon and I've gone through all the tutorials. What's a project
42+ I can work on?" Apprenticeships are our answer to that.
43+ </p>
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 %}
79+</section>
80+{% include "partials/footer.html" %}
81+{% endblock content %}
templates/grant_type/bounties.htmlnew file+47
@@ -0,0 +1,47 @@
1+{% extends "base.html" %}
2+
3+{% import "macros/macros.html" as macros %}
4+
5+{% block title %}
6+<meta name="og:title" content="Bounties Archive - {{ config.title }}">
7+<title>Bounties - {{ config.title }}</title>
8+{% endblock title %}
9+
10+{% block description %}
11+<meta name="og:description" content="Urbit Bounties Archive">
12+<meta name="description" content="Urbit Bounties Archive">
13+{% endblock description %}
14+
15+{% block image %}
16+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
17+{% endblock image %}
18+
19+{% block content %}
20+ {% set taxonomy = get_taxonomy(kind="grant_type") %}
21+ {% for t in taxonomy.items %}
22+ {% if t.name == 'bounties' %}
23+ {% set_global term = t %}
24+ {% endif %}
25+ {% endfor %}
26+<!-- header -->
27+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
28+ <a class="gray3" href="/">Urbit</a>
29+ <span class="gray3"> / </span>
30+ <a class="gray3" href="/grants">Grants</a>
31+ <span class="gray3"> / </span>
32+ <a href="{{ current_url }}">Bounties</a>
33+ {% include "partials/navigation-search.html" %}
34+</nav>
35+<!-- content -->
36+<section class="full c4-10-lg pt4 lh-copy">
37+ <h1>Bounties</h1>
38+ <p>Bounties are specific, tightly-scoped pieces of work that we at the Urbit Foundation think are of high value to the ecosystem at large. They're frequently development-focused, but also often relate to marketing, community-building or technical writing.</p>
39+ <p>Bounties are usually competitive&mdash;worker requests should provide plenty of information about why the requester is right candidate for the job.</p>
40+ {% for page in term.pages %}
41+ {% if not page.extra.canceled %}
42+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
43+ {% endif %}
44+ {% endfor %}
45+</section>
46+{% include "partials/footer.html" %}
47+{% endblock content %}
templates/grant_type/gifts.htmlnew file+56
@@ -0,0 +1,56 @@
1+{% extends "base.html" %}
2+
3+{% import "macros/macros.html" as macros %}
4+
5+{% block title %}
6+<meta name="og:title" content="Gifts Archive - {{ config.title }}">
7+<title>Gifts - {{ config.title }}</title>
8+{% endblock title %}
9+
10+{% block description %}
11+<meta name="og:description" content="Urbit Gifts Archive">
12+<meta name="description" content="Urbit Gifts Archive">
13+{% endblock description %}
14+
15+{% block image %}
16+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
17+{% endblock image %}
18+
19+{% block content %}
20+ {% set taxonomy = get_taxonomy(kind="post_type") %}
21+ {% for t in taxonomy.items %}
22+ {% if t.name == 'gifts' %}
23+ {% set_global term = t %}
24+ {% endif %}
25+ {% endfor %}
26+<!-- header -->
27+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
28+ <a class="gray3" href="/">Urbit</a>
29+ <span class="gray3"> / </span>
30+ <a class="gray3" href="/grants">Grants</a>
31+ <span class="gray3"> / </span>
32+ <a href="{{ current_url }}">Gifts</a>
33+ {% include "partials/navigation-search.html" %}
34+</nav>
35+<!-- content -->
36+<section class="full c4-10-lg pt4 lh-copy">
37+ <h1>Gifts</h1>
38+ <ul class="posts measure-wide">
39+ {% for page in term.pages %}
40+ <a class="bb-0" href="{{ page.permalink }}">
41+ <li class="mb4">
42+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
43+ <p class="mt0">{{ page.description }}</p>
44+ {% if page.extra.image %}
45+ <img class="pv2 obj-cover h5 w-100" src="{{ page.extra.image }}"/>
46+ {% endif %}
47+ <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
48+ <span class="mono f6">
49+ {% if page.extra.ship %}<address class="mono f6 ml2">{{ page.extra.ship }}</address> {% endif %}
50+ </span>
51+ </li>
52+ </a>
53+ {% endfor %}
54+ </ul>
55+{% include "partials/footer.html" %}
56+{% endblock content %}
templates/grant_type/list.htmlnew file+1
@@ -0,0 +1 @@
1+{% extends "grants/list.html" %}
templates/grant_type/proposals.htmlnew file+90
@@ -0,0 +1,90 @@
1+{% extends "base.html" %}
2+
3+{% import "macros/macros.html" as macros %}
4+
5+{% block title %}
6+<meta name="og:title" content="Proposals Archive - {{ config.title }}">
7+<title>Proposals - {{ config.title }}</title>
8+{% endblock title %}
9+
10+{% block description %}
11+<meta name="og:description" content="Urbit Proposals Archive">
12+<meta name="description" content="Urbit Proposals Archive">
13+{% endblock description %}
14+
15+{% block image %}
16+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
17+{% endblock image %}
18+
19+{% block content %}
20+ {% set taxonomy = get_taxonomy(kind="grant_type") %}
21+ {% for t in taxonomy.items %}
22+ {% if t.name == 'proposals' %}
23+ {% set_global term = t %}
24+ {% endif %}
25+ {% endfor %}
26+<!-- header -->
27+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
28+ <a class="gray3" href="/">Urbit</a>
29+ <span class="gray3"> / </span>
30+ <a class="gray3" href="/grants">Grants</a>
31+ <span class="gray3"> / </span>
32+ <a href="{{ current_url }}">Proposals</a>
33+ {% include "partials/navigation-search.html" %}
34+</nav>
35+<!-- content -->
36+<section class="full c4-10-lg pt4 lh-copy">
37+ <h1>Proposals</h1>
38+ <p>Community members may submit proposals for a wide range of projects that contribute to Urbit. Past proposals have spanned a wide range of topics: </p>
39+ <ul class="list mb2">
40+ <li>Development projects, like <a class="bb" href="/grants/webrtc-gall-agent-and-external-app/" target="_blank">WebRTC integration</a></li>
41+ <li>
42+ <a class="bb" target="_blank" href="/grants/a-book-about-urbit/">
43+ A book about Urbit
44+ </a>
45+ </li>
46+ <li>
47+ Creation of
48+ <a class="bb" target="_blank" href="/grants/urbit-explainer-video/">
49+ video
50+ </a>
51+ <a class="bb" target="_blank" href="/grants/comprehensive-local-server-and-mum-explanation-video/">
52+ content
53+ </a>
54+ </li>
55+ <li>
56+ <a class="bb" target="_blank" href="/grants/urbit-event-series/">
57+ Production of events
58+ </a>
59+ </li>
60+ <li>
61+ <a class="bb" target="_blank" href="/grants/urbit-online-meetup/">
62+ Hosting meetups
63+ </a>
64+ </li>
65+ <li>
66+ <a class="bb" target="_blank" href="/grants/graph-store-documentation-guide/">
67+ Writing documentation
68+ </a>
69+ </li>
70+ <li>
71+ <a class="bb" target="_blank" href="/grants/hoon-001-learner-efficiency-and-early-learner-resources/">
72+ Educational materials
73+ </a>
74+ </li>
75+ </ul>
76+
77+ <p>Proposals are more likely to be approved if their relevance to the project is made clear, their scope is clearly defined, the proposer is qualified, and it's obvious that a lot of thought has gone into the idea.</p>
78+
79+ <a class="b bb" href="https://airtable.com/shrCi54rEDxgSZr3z" target="_blank">
80+ Propose a project
81+ </a>
82+
83+ {% for page in term.pages %}
84+ {% if not page.extra.canceled %}
85+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
86+ {% endif %}
87+ {% endfor %}
88+</section>
89+{% include "partials/footer.html" %}
90+{% endblock content %}
templates/grant_type/single.htmlnew file+23
@@ -0,0 +1,23 @@
1+{% extends "taxonomy/single.html" %}
2+
3+{% import "macros/macros.html" as macros %}
4+
5+{% block content %}
6+<!-- header -->
7+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
8+ <a class="gray3" href="/">Urbit</a>
9+ <span class="gray3"> / </span>
10+ <a class="gray3" href="/grants">Grants</a>
11+ <span class="gray3"> / </span>
12+ <a href="{{ current_url }}">{{ term.name | capitalize }}</a>
13+ {% include "partials/navigation-search.html" %}
14+</nav>
15+<!-- content -->
16+<section class="full c4-10-lg pt4 lh-copy">
17+ <h1>Grant Type: {{ term.name | capitalize}}</h1>
18+ {% for page in term.pages %}
19+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
20+ {% endfor %}
21+</section>
22+{% include "partials/footer.html" %}
23+{% endblock content %}
templates/grants/grant.htmlnew file+71
@@ -0,0 +1,71 @@
1+{% extends "page.html" %}
2+
3+{% block content %}
4+
5+<!-- header -->
6+<!-- content -->
7+{%- set lowercasetitle = page.title | lower | split(pat=" ") | join(sep="") -%}
8+{% if section or lowercasetitle == page.components[0] %}
9+<nav class="mt4 pb4 fixed-xl full fourth-1-md fourth-1-lg page-indiced mb3 mb0-m mb0-l mb0-xl">
10+ <a class="gray3" href="/">Urbit</a>
11+ <span class="gray3"> / </span>
12+ <a href="/{{ page.components[0] }}">
13+ {{ page.title }}
14+ </a>
15+
16+ {% include "partials/navigation-search.html" %}
17+</nav>
18+{% else %}
19+<nav class="mt4 fixed-xl full fourth-1-md fourth-1-lg page-indiced mb3 mb0-m mb0-l mb0-xl">
20+ <a class="gray3" href="/">Urbit</a>
21+ <span class="gray3"> / </span>
22+ <a href="/grants">Grants</a>
23+
24+ {% include "partials/navigation-search.html" %}
25+
26+</nav>
27+
28+{% endif %}
29+
30+<article class="mt4 mb4 c1-13 c4-12-lg measure-wide">
31+ {% if page.extra.hidetitle %} {% else %}<h1>{{ page.title }}</h1>{% endif %}
32+
33+ {% if page.extra.image %}
34+ <img class="db mv2 obj-cover w-100 ba" src="{{ page.extra.image }}" />
35+ {% endif %}
36+
37+ {% if page.extra.mentor %}
38+ <span class="db mb1">Mentor: <span class="mono">{{ page.extra.mentor }}</span></span>
39+ {% endif %}
40+
41+ {% if page.extra.assignee %}
42+ <span class="db mb1">
43+ Worker(s):
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>
50+ {% endif %}
51+
52+
53+ {% if page.extra.completed %}
54+ <span class="db mb1">Completed</span>
55+ {% elif page.extra.assignee %}
56+ <span class="db mb1">WIP</span>
57+ {% elif page.extra.work_request_link %}
58+ <a href="{{ page.extra.work_request_link }}" target="_blank">
59+ Apply for this grant
60+ </a>
61+ {% endif %}
62+
63+ {% if page.date %}
64+ <time class="mono db mv1 gray2 f5">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
65+ {% endif %}
66+
67+ <!-- body -->
68+ {{ page.content | safe }}
69+</article>
70+
71+{% endblock content %}
templates/grants/list.htmlnew file+98
@@ -0,0 +1,98 @@
1+{% extends "base.html" %}
2+{% import "macros/macros.html" as macros %}
3+
4+{% block title %}
5+ <meta name="og:title" content="Grants - {{ config.title }}">
6+ <title>Grants - {{ config.title }}</title>
7+{% endblock title %}
8+
9+{% block description %}
10+ <meta name="og:description" content="Grants facilitated by the Urbit Foundation.">
11+ <meta name="description" content="Grants facilitated by the Urbit Foundation.">
12+{% endblock description %}
13+
14+{% block content %}
15+{% set posts = get_section(path="grants/_index.md") %}
16+<!-- header -->
17+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl fixed-xl">
18+ <a class="gray3" href="/">Urbit</a>
19+ <span class="gray3"> / </span>
20+ <a href="/grants/">Grants</a>
21+
22+ {% include "partials/navigation-search.html" %}
23+
24+</nav>
25+<section class="full c4-10-lg pt4 lh-copy">
26+
27+ <h1>Urbit Grants Program</h1>
28+
29+ <p>Urbit is a community project. While anyone can contribute, we help focus development and reward exceptional contribution through our grants program.</p>
30+
31+ <p>We reward contributors in four different ways:</p>
32+ <ul class='list'>
33+ <li class="mb2"><a class="b bb" href="/grants/proposals">Proposals</a> from community members to work on their own projects</li>
34+ <li class="mb2"><a class="b bb" href="/grants/bounties">Bounties</a> for specific work needed by the Urbit Foundation</li>
35+ <li class="mb2"><a class="b bb" href="/grants/apprenticeships">Apprenticeships</a> for projects undertaken with a mentor</li>
36+ <li class="mb2"><a class="b bb" href="/grants/gifts">Gifts</a> given post facto for exceptional contributions</li>
37+ </ul>
38+
39+ <div class="flex tc mv5 flex-wrap">
40+ <figure class="flex-auto">
41+ <span class="f2">&gt;200</span>
42+ <figcaption class="f5">Stars Awarded</figcaption>
43+ </figure>
44+ <figure class="flex-auto">
45+ <span class="f2" id="worth">&gt;400</span>
46+ <figcaption class="f5">Different Contributors</figcaption>
47+ </figure>
48+ <figure class="flex-auto">
49+ <span class="f2">&gt;45</span>
50+ <figcaption class="f5">Active Projects</figcaption>
51+ </figure>
52+ </div>
53+
54+ <p>Contributors of all types have access to a wide variety of resources while working on projects, including a supportive team at urbit.org, Tlon developers, and community mentors.</p>
55+
56+ <blockquote class="pa4 ba">&ldquo;I paid off my student loans through the Urbit grants program, and had fun doing it!&rdquo;<br /><cite class="mono">~radbur-sivmus</cite></blockquote>
57+
58+ <h2 class="mt5">Featured grants</h2>
59+
60+ <p>These grants should give you a general idea of what kind of work we reward:</p>
61+
62+ <div class="grid12">
63+
64+ <div class="c1-13 c1-6-md c1-5-lg flex items-stretch pv3">
65+ {% set page = get_page(path="grants/bitcoin-full-node-provider-and-wallet.md") %}
66+ {{ macros::grant(page=page, mode="mini") }}
67+ </div>
68+
69+ <div class="c1-13 c6-13-md c5-9-lg flex items-stretch pv3">
70+ {% set page = get_page(path="grants/webrtc-gall-agent-and-external-app.md") %}
71+ {{ macros::grant(page=page, mode="mini") }}
72+ </div>
73+
74+ <div class="c1-13 c1-13-md c9-13-lg flex items-stretch pv3">
75+ {% set page = get_page(path="grants/urbian-a-customized-linux-distribution-for-urbit-appliances.md") %}
76+ {{ macros::grant(page=page, mode="mini") }}
77+ </div>
78+
79+ </div>
80+
81+ <h2 class="mt5">Available and Closed Grants</h2>
82+
83+ <ul class="flex flex-wrap mv5">
84+ {% set categories = get_taxonomy(kind="grant_category") %}
85+ {% for category in categories.items %}
86+ <li style="flex: 0 1 15rem;" class="f5 flex items-center"><a href="{{ category.permalink }}" class="bb">{{ category.name }}</a></li>
87+ {% endfor %}
88+ </ul>
89+
90+ {% for page in posts.pages %}
91+ {% if not page.extra.canceled %}
92+ {{ macros::grant(page=page, classes="full c1-10-lg mv5")}}
93+ {% endif %}
94+ {% endfor %}
95+
96+</section>
97+{% include "partials/footer.html" %}
98+{% endblock content %}
templates/index.html+100−81
@@ -7,35 +7,40 @@
77{% endblock templatestyles %}
88
99{% block image %}
10− <meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
10+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
1111{% endblock image %}
1212
1313{% block bodyclasses %}class="index"{% endblock bodyclasses %}
1414
1515{% block title %}
16− <meta name="og:title" content="{{ config.title }} - Your personal server">
17− <title>{{ config.title }} - Your personal server</title>
16+<meta name="og:title" content="{{ config.title }} - Your personal server">
17+<title>{{ config.title }} - Your personal server</title>
1818{% endblock title %}
1919{% block description %}
20− <meta name="og:description" content="Urbit is a simple, durable system for running a personal server that you own 100% and forever.">
21− <meta name="description" content="Urbit is a simple, durable system for running a personal server that you own 100% and forever.">
20+<meta name="og:description"
21+ content="Urbit is a simple, durable system for running a personal server that you own 100% and forever.">
22+<meta name="description"
23+ content="Urbit is a simple, durable system for running a personal server that you own 100% and forever.">
2224{% endblock description %}
2325{% block content %}
2426
2527<section class="full c2-12-md c3-11-lg">
2628 <div class="flex flex-row justify-between mt6 mb5">
27− <h1 class="f5 fw4">Urbit</h1>
29+ <h1 class="f5 fw4">Urbit</h1>
2830 <nav class="flex flex-row dib-m dib-l dib-xl">
2931 <a href="/install" class="dn di-m di-l di-xl f5 fw4 pv1 ph3 tc bg-yellow3-faded yellow3-new br3">Download Port</a>
3032 <a href="/docs" class="f5 fw4 pv1 ph3 tc gray6 ml0 ml3-m ml3-l ml3-xl">Docs</a>
3133 <a href="/blog" class="f5 fw4 pv1 ph3 tc gray6 ml0 ml3-m ml3-l ml3-xl">Blog</a>
3234 </nav>
3335 </div>
34− <h2 class="f3 fw6 mv6">A <span class="tooltip" title="Able to do anything you can imagine a computer can do.">general purpose</span>, <span class="tooltip" title="Built from scratch for direct communication between machines - no intermediate platforms required.">peer-to-peer</span>, <br> personal computing system.</h2>
36+ <h2 class="f3 fw6 mv6">A <span class="tooltip" title="Able to do anything you can imagine a computer can do.">general
37+ purpose</span>, <span class="tooltip"
38+ title="Built from scratch for direct communication between machines - no intermediate platforms required.">peer-to-peer</span>,
39+ <br> personal computing system.</h2>
3540</section>
3641
3742<section class="full c2-12-md c2-12-lg mb6">
38− <img class='w-100' src="https://media.urbit.org/hero.svg"/>
43+ <img class='w-100' src="https://media.urbit.org/hero.svg" />
3944
4045 <div class="w-100 mt5 tc dib">
4146 <h1 class="tracked-tight dib" style="font-size: 100px;">Port</h1>
@@ -43,12 +48,12 @@
4348 <div id="download" class="db">
4449 <div id="download-div" class="fw5 bg-yellow3-new white br3 pv3 ph4 dib">
4550 <a id="download-info" href="https://github.com/arthyn/port/releases/latest/download/Port.dmg">
46− Download for macOS
47− </a>
48− </div>
49− <a class="f6 db mv3 fw6 gray6" href="/getting-started/cli">Other platforms (CLI)</a>
51+ Download for macOS
52+ </a>
5053 </div>
54+ <a class="f6 db mv3 fw6 gray6" href="/getting-started/cli">Other platforms (CLI)</a>
5155 </div>
56+ </div>
5257</section>
5358
5459<section class="full lh-copy c2-7-md c3-7-lg mb6">
@@ -75,98 +80,112 @@
7580<section class="full c7-12-md c7-11-lg mb5">
7681 {% set s = get_section(path="events/_index.md") %}
7782 {% set pins = s.pages
78− | filter(attribute="extra.pinned", value=true)
79− | sort(attribute="date")
80− | reverse
81− %}
83+ | filter(attribute="extra.pinned", value=true)
84+ | sort(attribute="date")
85+ | reverse
86+ %}
8287 {% set allposts = s.pages
83− | sort(attribute="date")
84− | filter(attribute="extra.pinned", value=false)
85− | concat(with=pins)
86− | reverse
87− %}
88+ | sort(attribute="date")
89+ | filter(attribute="extra.pinned", value=false)
90+ | concat(with=pins)
91+ | reverse
92+ %}
8893 {% for page in allposts | slice (end=2) %}
89− <li class="mb4 list event">
90− <a class="bb-0" href="{{ page.permalink }}">
91− <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
92− {% if page.extra.description %}
93− <p class="lh-copy mt1">{{ page.extra.description }}</p>
94− {% endif %}
95− </a>
96− {{ macros::event_metadata(page=page)}}
97− </li>
94+ <li class="mb4 list event">
95+ <a class="bb-0" href="{{ page.permalink }}">
96+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
97+ {% if page.extra.description %}
98+ <p class="lh-copy mt1">{{ page.extra.description }}</p>
99+ {% endif %}
100+ </a>
101+ {{ macros::event_metadata(page=page)}}
102+ </li>
98103 {% endfor %}
99104 <a href="/events" class="bb">View more events</a>
100105</section>
101106
107+<section class="full lh-copy c2-7-md c3-7-lg mb5">
108+ <h1 class="mb3">Grants Program</h1>
109+ <p>We regularly give away address space to reward community contributions, including education, promotion, and
110+ development.</p>
111+ <figure class="tc w-50 mt3 mb4 fl">
112+ <span class="f3">&gt;$1,000,000</span>
113+ <figcaption class="f5">USD worth rewarded</figcaption>
114+ </figure>
115+ <figure class="tc w-50 mt3 mb4 fl">
116+ <span class="f3">&gt;90</span>
117+ <figcaption class="f5">Grants &amp; Bounties</figcaption>
118+ </figure>
119+ <a href="/grants" class="bb">Learn more here</a>
120+</section>
121+
122+<section class="full lh-copy c7-9-md c7-9-lg mb5">
123+ <div class="list mt4">
124+ <p><a href="/docs/development/develop" class="bb">Getting Started Guide</a></p>
125+ <p><a href="web+urbitgraph://group/~bitbet-bolbel/urbit-community/graph/~darrux-landes/development" class="bb"
126+ target="_blank">Development channel on Landscape</a></p>
127+ <p><a href="https://github.com/urbit/awesome-urbit" class="bb" target="_blank">Developer resource list</a></p>
128+ </div>
129+</section>
102130
131+<section class="full lh-copy dn db-l db-xl c9-12-md c9-11-lg mb5">
132+ <img class="w-100 fl" src="https://media.urbit.org/site/understanding-urbit/network-os/urbit-os-diagram-apart.svg" />
133+</section>
103134
104135<section class="full c2-7-md c3-7-lg mt5">
105136 <h1 class="mb3">Latest Posts</h1>
106− <p class="lh-copy mt1">We regularly write posts on our <a class="bb" href="/blog">blog</a> about what we're working on.</p>
137+ <p class="lh-copy mt1">We regularly write posts on our <a class="bb" href="/blog">blog</a> about what we're working
138+ on.</p>
107139 {% set s = get_section(path="updates/_index.md") %}
108140 {% set e = get_section(path="blog/_index.md") %}
109141 {% set allposts = s.pages
110− | concat (with=e.pages)
111− | sort(attribute="date")
112− | reverse
113− %}
142+ | concat (with=e.pages)
143+ | sort(attribute="date")
144+ | reverse
145+ %}
114146 {% for page in allposts | slice (end=2) %}
115147 <li class="mb4 list">
116− <a class="bb-0" href="{{ page.permalink }}">
117− <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
118− {% if page.extra.image %}
119− <img class="db mv2 obj-cover h4 w-50 ba" src="{{ page.extra.image }}" />
120− {% elif page.extra.description %}
121− <p class="lh-copy mt1">{{ page.extra.description }}</p>
148+ <a class="bb-0" href="{{ page.permalink }}">
149+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
150+ {% if page.extra.image %}
151+ <img class="db mv2 obj-cover h4 w-50 ba" src="{{ page.extra.image }}" />
152+ {% elif page.extra.description %}
153+ <p class="lh-copy mt1">{{ page.extra.description }}</p>
154+ {% endif %}
155+ <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
156+ <span class="mono f6">
157+ {% if page.extra.ship %}
158+ <address class="mono f6 mh2">{{ page.extra.ship }}</address>
122159 {% endif %}
123− <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
124− <span class="mono f6">
125− {% if page.extra.ship %}
126− <address class="mono f6 mh2">{{ page.extra.ship }}</address>
127− {% endif %}
128− </span>
129− </a>
130− </li>
160+ </span>
161+ </a>
162+ </li>
131163 {% endfor %}
132164</section>
133165
134166
135167<section class="full lh-copy c7-12-md c7-11-lg mt5" id="follow">
136168 <p class="lh-copy mt1 mb3">
137− We send regular updates about our project. Enter your email to get them.
138− </p>
139− <iframe name="nothing" style="display:none;"></iframe>
140− <form
141− action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
142− method="post"
143− id="mc-embedded-subscribe-form"
144− name="mc-embedded-subscribe-form"
145− class="validate form"
146− target="_blank"
147− novalidate>
148− <div class="input-group" id="mc_embed_signup_scroll">
149− <div class="mc-field-group w-100 relative">
150− <input
151− class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none"
152− type="email"
153− name="EMAIL"
154− id="mce-EMAIL"
155− placeholder="your@email.com"/>
156− <button
157− id="mc-embedded-subscribe"
158− class="dib bn absolute bg-transparent"
159− style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;"
160− type="submit"
161− name="subscribe"
162− onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
163− <span class="fr pr1">-></span>
164− </button>
165− </div>
169+ We send regular updates about our project. Enter your email to get them.
170+ </p>
171+ <iframe name="nothing" style="display:none;"></iframe>
172+ <form action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
173+ method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate form"
174+ target="_blank" novalidate>
175+ <div class="input-group" id="mc_embed_signup_scroll">
176+ <div class="mc-field-group w-100 relative">
177+ <input class="bg-white black b--black ba pa3 w-100 mb2 br0 wk-appearance-none" type="email" name="EMAIL"
178+ id="mce-EMAIL" placeholder="your@email.com" />
179+ <button id="mc-embedded-subscribe" class="dib bn absolute bg-transparent"
180+ style="font-family: 'Inter UI', san-serif; right: 3px; top: 15px; -webkit-appearance: none;" type="submit"
181+ name="subscribe" onclick="_paq.push(['trackEvent', 'Mailing List', 'Subscribe'])">
182+ <span class="fr pr1">-></span>
183+ </button>
166184 </div>
167− </form>
185+ </div>
186+ </form>
168187 <p class="lh-copy">
169− Follow us on <a class="b--black bb" href="https://twitter.com/urbit">Twitter</a>
188+ Follow us on <a class="b--black bb" href="https://twitter.com/urbit">Twitter</a>
170189 </p>
171190 <p class="lh-copy">
172191 Explore the code on <a class="b--black bb" href="https://github.com/urbit/urbit">GitHub</a>
@@ -181,4 +200,4 @@
181200
182201
183202{% include "partials/footer.html" %}
184−{% endblock content %}
203+{% endblock content %}
templates/macros/macros.html+55−1
@@ -8,4 +8,58 @@
88 {% endif %}
99 <time class="mono f6 gray2 fr">{{ page.date | date(format="~%Y.%-m.%-d") }} {{ page.extra.time }} </time>
1010 </span>
11−{% endmacro event_metadata %}
11+{% endmacro event_metadata %}
12+
13+{% macro reward(page) %}
14+ {{ page.extra.reward }} star{% if page.extra.reward > 1 %}s{% endif %} {% if not page.extra.assignee %}reward{% else %}{% if page.extra.completed %}awarded{% else %}pending{% endif %}{% endif %}
15+{% endmacro reward %}
16+
17+{% macro grant(page, mode="full", classes="") %}
18+ {% if mode == "mini" %}
19+ <article data-date="{{ page.date }}" id="grant-{{ page.slug }}" class="grant flex items-stretch {{ classes }}">
20+ <a href="{{ page.permalink }}" class="no-underline bb-0 flex flex flex-column justify-between">
21+ <h1>{{ page.title }}</h1>
22+ <div class="lh-copy">
23+ {% if page.extra.description %}
24+ <p>{{ page.extra.description }}</p>
25+ {% endif %}
26+ </div>
27+ <div class="gray3">
28+ {% if page.extra.reward %}
29+ <span>{{ macros::reward(page=page) }}</span>
30+ {% endif %}
31+ </div>
32+ </a>
33+ </article>
34+ {% else %}
35+ <article data-date="{{ page.date }}" id="grant-{{ page.slug }}" class="grant {{ classes }} {% if page.extra.pinned %}bg-gray4 na3 pa3{% endif %}">
36+ <div class="grid12">
37+ <h1 class="full"><a href="{{ page.permalink }}" class="no-underline bb-0">{{ page.title }}</a></h1>
38+ <div class="full c1-8-lg lh-copy">
39+ {% if page.extra.description %}
40+ <p>{{ page.extra.description }}</p>
41+ {% endif %}
42+ </div>
43+ {% if page.extra.image %}
44+ <img class="db mv2 h4 ba obj-cover full c8-13-lg" src="{{ page.extra.image }}" />
45+ {% endif %}
46+ <div class="full flex flex-wrap">
47+ {% for category in page.taxonomies.grant_category %}
48+ <a href="{{ get_taxonomy_url(kind="grant_category", name=category, lang=page.lang) }}" class="mr3 gray1">{{ category }}</a>
49+ {% endfor %}
50+ {% if page.extra.reward %}
51+ <span class="mr3 gray1">{{ macros::reward(page=page) }}</span>
52+ {% endif %}
53+ {% if page.extra.assignee %}
54+ <span class="mr3 gray1 mono">{{ page.extra.assignee }}</span>
55+ {% endif %}
56+ {% if page.extra.work_request_link and not page.extra.assignee %}
57+ <a href="{{ page.extra.work_request_link }}" target="_blank">
58+ Apply for this grant
59+ </a>
60+ {% endif %}
61+ </div>
62+ </div>
63+ </article>
64+ {% endif %}
65+{% endmacro grant %}
templates/page_indiced.html+2−2
@@ -46,9 +46,9 @@
4646 <span class="gray3"> / </span>
4747 <a href="/{{ page.components[0] }}{% if page.components[2] %}/{{ page.components[1] }}{% endif %}">
4848 {% if page.components[2] %}
49− {{ page.components[1] | capitalize }}
49+ {{ page.components[1] | replace(from="-", to=" ") | title }}
5050 {% else %}
51− {{ page.components[0] | capitalize }}
51+ {{ page.components[0] | replace(from="-", to=" ") | title }}
5252 {% endif %}
5353 </a>
5454
templates/post_type/list.htmlnew file+1
@@ -0,0 +1 @@
1+{% extends "taxonomy/list.html" %}
templates/post_type/single.htmlnew file+1
@@ -0,0 +1 @@
1+{% extends "taxonomy/single.html" %}
templates/taxonomy/list.htmlnew file+33
@@ -0,0 +1,33 @@
1+{% extends "base.html" %}
2+
3+{% block title %}
4+<meta name="og:title" content="{{ taxonomy.name | capitalize }} - {{ config.title }}">
5+<title>{{ taxonomy.name | capitalize }} - {{ config.title }}</title>
6+{% endblock title %}
7+
8+{% block description %}
9+<meta name="og:description" content="{{ taxonomy.name | capitalize }} archive">
10+<meta name="description" content="{{ taxonomy.name | capitalize }} archive">
11+{% endblock description %}
12+
13+{% block image %}
14+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
15+{% endblock image %}
16+
17+{% block content %}
18+<!-- header -->
19+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
20+ <a class="gray3" href="/">Urbit</a>
21+ {% include "partials/navigation-search.html" %}
22+</nav>
23+<!-- content -->
24+<article class="mt4 mb4 c1-13 c4-12-lg">
25+ <h1>Grant Type: {{ taxonomy.name | capitalize }}</h1>
26+ <ul class="posts measure-wide">
27+ {% for term in terms %}
28+ <li><a href="{{ term.permalink }}">{{ term.name }}</a> ({{ term.pages | length }} posts)</li>
29+ {% endfor %}
30+ </ul>
31+</article>
32+{% include "partials/footer.html" %}
33+{% endblock content %}
templates/taxonomy/single.htmlnew file+44
@@ -0,0 +1,44 @@
1+{% extends "base.html" %}
2+
3+{% block title %}
4+<meta name="og:title" content="{{ term.name | capitalize }} Archive - {{ config.title }}">
5+<title>{{ term.name | capitalize }} - {{ config.title }}</title>
6+{% endblock title %}
7+
8+{% block description %}
9+<meta name="og:description" content="Urbit {{ term.name | capitalize }} Archive">
10+<meta name="description" content="Urbit {{ term.name | capitalize }} Archive">
11+{% endblock description %}
12+
13+{% block image %}
14+<meta name="twitter:image" content="https://media.urbit.org/logo/urbit-logo-card.png">
15+{% endblock image %}
16+
17+{% block content %}
18+<!-- header -->
19+<nav class="mt4 full fourth-1-lg mb3 mb0-m mb0-l mb0-xl">
20+ <a class="gray3" href="/">Urbit</a>
21+ {% include "partials/navigation-search.html" %}
22+</nav>
23+<!-- content -->
24+<article class="mt4 mb4 c1-13 c4-12-lg">
25+ <ul class="posts measure-wide">
26+ {% for page in term.pages %}
27+ <a class="bb-0" href="{{ page.permalink }}">
28+ <li class="mb4">
29+ <h2 class="f5 fw6 mt0 mb1">{{ page.title }}</h2>
30+ <p class="mt0">{{ page.description }}</p>
31+ {% if page.extra.image %}
32+ <img class="pv2 obj-cover h5 w-100" src="{{ page.extra.image }}"/>
33+ {% endif %}
34+ <time class="mono f6">{{ page.date | date(format="~%Y.%-m.%-d") }}</time>
35+ <span class="mono f6">
36+ {% if page.extra.ship %}<address class="mono f6 ml2">{{ page.extra.ship }}</address> {% endif %}
37+ </span>
38+ </li>
39+ </a>
40+ {% endfor %}
41+ </ul>
42+</article>
43+{% include "partials/footer.html" %}
44+{% endblock content %}