on master help sign in
22 files changed+826−70
since splitsnapshots
unifiedsplit
content/blog/aesthetic-culture-1.md+1−1 content/blog/ares.md+51 content/blog/foss-2.md+59 content/blog/hoon-4-lispers.md+96−53 content/communities/urbit-paris.md+23 content/events/2023-06-24-urbit-meetup-christchurch.md+24 content/events/2023-06-29-Urbit-Paris-Meetup-1.md+30 content/events/2023-07-01_urbit-meetup-mst.md+23 content/events/2023-07-20-Urbit-Paris-Meetup-ethcc.md+53 content/grants/2022/chess-bounty.md+2 content/grants/2023/aera.md+50 content/grants/2023/elm.md+68 content/grants/2023/json-parser-suite.md+1−1 content/grants/2023/mapping-ids.md+106 content/grants/2023/pastebin.md → content/grants/2023/pastebin-RFP.md+5−1 content/grants/2023/pastebin-proposal.md+33 content/grants/2023/replit.md+52 content/grants/2023/school-support-23q1.md+1−1 content/grants/2023/splitwise-rfp.md+26 content/grants/2023/splitwise.md+113−9 content/grants/2023/uc-concierge.md+3−3 vercel.json+6−1
content/blog/aesthetic-culture-1.md+1−1
@@ -5,7 +5,7 @@ date = "2020-11-11"
55
66[extra]
77description = "One of the most exciting things about Urbit is the aesthetic and design around it, developed partly by Tlon (through the design of Urbit itself) and partly by the community (by producing great Urbit art)."
8−author = "Nikolai Mallett"
8+author = "~nartes-fasrum"
99ship = "~nartes-fasrum"
1010image = "https://media.urbit.org/site/posts/essays/help-the-environment.jpg"
1111+++
content/blog/ares.mdnew file+51
@@ -0,0 +1,51 @@
1++++
2+title = "Ares"
3+date = "2023-06-26"
4+description = "A light technical description of Ares, the new Urbit runtime"
5+
6+[extra]
7+author = "Noah Kumin"
8+ship = "~librex-dozryc"
9+image = "https://storage.googleapis.com/media.urbit.org/blog/ares-header.png"
10++++
11+
12+![Image](https://storage.googleapis.com/media.urbit.org/blog/ares-header.png)
13+
14+## What is Ares?
15+
16+Ares is a new Urbit runtime that will be much faster and manage a much larger amount of data than previous versions of the runtime. Those new to Urbit commonly ask if they will be able to host photos and videos on their Urbit ships. Ares—a joint project from the Urbit Foundation, Tlon, and Zorp—sets the stage for us to be able to answer, simply, “Yes.” Ares is still a work in progress, but we expect to see the new binaries rolled out later this year. There are three components to the project. Let’s talk about them one by one.
17+
18+## 1. Code Generation
19+
20+Modern CPUs are extraordinarily fast. But until now your Urbit hasn’t been able to take full advantage of this fact. One way to conceptualize the problem is to imagine a train that is only able to go as fast as a track-worker can lay down track for it. In this analogy, your CPU is the train, and the track-worker is the Urbit runtime. The aim is to have large sections of track laid down ahead of time. Ares includes a codegen system that compiles Nock, Urbit’s assembly language, to machine code that the CPU can predict well.
21+
22+This system addresses what has until now been a problem: Nock is meant to invoke other code in a given Urbit computer’s “subject.” Or, in more common parlance, in the computer’s “state.” Your state changes with every new message your Urbit computer sends and receives, or with any new event in any app. That makes it hard to make the resulting machine code run fast, since the CPU needs to read from the subject while it’s running in order to figure out what machine code will be run next.
23+
24+The new code generation process in Ares solves this problem by using a system which the developers have called “subject knowledge analysis.” What does this mean? By analyzing how an Urbit subject might change over the course of a Nock computation, Ares will learn about the subject's tree shape and about its data dependencies (*i.e.*, the way that later parts of the computation depend on earlier parts of the computation). This allows those parts of the subject which are known at the time of compiling Nock to machine code to remain known at later points in the computation.
25+
26+To go back to our metaphor of train tracks, this is what allows the “track” to be laid down ahead of time. This set of known parts of the subject typically includes Nock formulas stored in [cores](https://developers.urbit.org/guides/core/hoon-school/F-cores#cores). This allows the resulting machine code to use direct jumps to perform Nock function calls. Without this “subject knowledge analysis,” the CPU would have had to perform an “indirect jump” by calculating the location to which a later instruction would jump. Now your computer’s CPU can jump directly to where it’s supposed to go.
27+
28+## 2. 2stackz Noun Allocator
29+
30+Ares will make use of what we’re calling the *2stackz noun allocator*. With the advent of Ares, your Urbit will be a virtual machine with two stacks and no heap. What does this mean? Traditionally, a program has a *stack* and a *heap*. The stack is a linear data structure within a program used for the program’s execution. The heap is a less structured region of memory that is used for storing large pieces of data or data that you want to keep around for a while without taking up space in the stack. However, the heap is slower, because its system for allocating memory is less orderly. (Imagine, say, trying to find a specific pair of socks in a heap of clothing.)
31+
32+Ares recognizes that because Nock is much more constrained than most languages, the Urbit runtime doesn’t actually need a heap. Instead you can take the function call stack and split it in two. The top of either stack can then be used as a little temporary heap. Whenever a function executes, you copy the data that gets returned from one stack to the other. And all the intermediate products that get created when running that function (*i.e.*, other functions that got called by the initial function) sit there as *garbage* (unwanted or unused data) in between the two stacks. But you don’t have to do the same sort of bookkeeping—tracking and updating these values—that you would have to do with a heap.
33+
34+Every piece of data in your Urbit computer is a noun. A noun is an atom (a positive integer or zero) or a cell (a pair of nouns). Before Ares, both allocating and freeing a noun in the Urbit runtime were processes that took a lot of time. (To *allocate* a noun is to put that noun in memory and to *free* it is to tell your urbit that you don’t need it any more.) Ares should make both of these processes much faster. This is good news because the Urbit runtime allocates nouns (particularly pairs of nouns, known as cells) like nobody’s business.
35+
36+## 3. Persistent Memory Arena
37+
38+Ares’s Persistent Memory Arena is for managing large amounts of data within your urbit in such a way that your urbit does not get slow. If you have terabytes of data within your Urbit, you can only have a very small subset of that within your hardware’s RAM at a given time. The rest of that data is going to have to live on disk—the section of your hardware that is more capacious but takes more time to access.
39+
40+To deal with this fact, your motherboard moves data back and forth between RAM and disk depending on what data needs to be accessed at a given time. This is known as *paging*, because it does so one *page* (usually four kilobytes) at a time. Traditionally operating systems will handle paging for you, but they do it in a generic way. The Persistent Memory Arena is designed specifically for managing Urbit's single-level store.
41+
42+A *single-level store* means that there’s no distinction in the operating system between data that lives in RAM and data that lives on disk. Instead of having two levels from which you can access data, you only have one, and the system itself manages which parts of the data are in RAM and which are in disk. The Persistent Memory Arena is an optimization for handling a large amount of data in a single level store. It is for nouns that persist between computations. Using the PMA, your urbit’s state can grow large without being hemmed in by the limitations of your hardware’s RAM.
43+
44+
45+## Updates and Links
46+
47+You can find the Ares GitHub repository [here](https://github.com/urbit/ares). The technical proposal is [here](https://github.com/urbit/ares/blob/status/docs/proposal/proposal-nock-performance.md). Check back at the Urbit Google Groups [listserv](https://groups.google.com/a/urbit.org/g/dev/), the [@zodisok](https://twitter.com/zodisok) Twitter account, and the Urbit Foundation [group](https://tlon.network/lure/~halbex-palheb/uf-public) for updates about the upcoming release.
48+
49+–
50+
51+*Noah Kumin is the founder and editor in chief of the [Mars Review of Books](https://marsreview.org/).*
content/blog/foss-2.mdnew file+59
@@ -0,0 +1,59 @@
1++++
2+title = "Urbit's Open Source Culture, Part II"
3+date = "2023-06-13"
4+description = "How will Urbit continue to foster its innovative open source software culture?"
5+
6+[extra]
7+author = "N E Davis"
8+ship = "~lagrev-nocfep"
9+image = "https://spacecenter.org/wp-content/uploads/2023/02/img-apollo-mission-control-3.jpg"
10++++
11+
12+![](https://spacecenter.org/wp-content/uploads/2023/02/img-apollo-mission-control-3.jpg)
13+
14+> God watches over fools, drunks, and the United States of America. (Otto von Bismarck, apocryphal)
15+
16+In our last installment, we considered how Urbit has grown its own robust open source culture. Now we look to the future: what will it take for Urbit to succeed, not only as an exemplary open source project but as a computing platform that delivers on its promise?
17+
18+Part of what makes an open source culture vibe is remix culture, the ability to rework the source material to produce novel components or manifestations. Urbit has the raw materials for this in spades, memetically and technically. It is up to us to keep these tools in our developers’ and enthusiasts’ hands.
19+
20+The default answer, which isn't terrible, is that Urbit should keep doing what it's done to get this far:
21+
22+1. Urbit should continue to prioritize decentralized development.
23+2. Urbit should lean into ownership-based incentives. Indeed, this is the most effective lever that the Urbit Foundation has.
24+3. Urbit should maintain the developer's republic. Core developers should rub shoulders with first-time Hooners.
25+4. Urbit should continue to ship source with code, since that is how code is actually distributed. The means of open source software are _necessarily in the user's hands_ with Martian software.
26+
27+There are some areas in which we hope to improve. Our documentation continues to expand, as do our educational offerings. We have a mandate to use the Urbit Foundation’s endowment of stars to produce the mature Urbit.
28+
29+What else should we have an eye to in the near future? There’s always more to do, but by prioritizing the items on this short list we would continue to elaborate our open source bona fides as a community and a steering foundation.
30+
31+1. **Code accessibility should be a priority.** Any computer language falls on the spectrum between machine legibility (the pole of machine code and assembly language) and human legibility (the pole of [Scratch](https://scratch.mit.edu/). All code must walk this line.
32+
33+ Hoon has had a reputation for being a language of dense expressions, which we believe is now being cleared by sunshine. However, Hoon's extensive sugar syntax and irregular expressiveness can make it challenging for those relatively new to Hoon to decipher programs. We can support their learning and entry into the ecosystem by defining a subset of Hoon syntax that we adhere to in all of the docs and some of the userspace code. Even if there is a "better" way to write it, we should prefer this restricted discipline in those cases. Let's call this subset "Hoon Prime." Hoon Prime will not always be the most concise Hoon code, and it will likely fail to maintain certain well-established preferences, like heavier expressions going to the bottom, but it should encourage developers to produce generators and agents from `%base`-distributed models as quickly as possible.
34+
35+ Hoon Prime should also adopt a standard of literate programming. Several example files already display such a self-documenting nature:
36+
37+ - [`simple.hoon` for solid-state subscriptions](https://github.com/wicrum-wicrun/sss/blob/master/urbit/app/simple.hoon)
38+ - [`deco.hoon` for doccords](https://github.com/urbit/urbit/blob/develop/pkg/arvo/lib/deco.hoon)
39+ - [`pals.hoon`](https://github.com/Fang-/suite/blob/master/app/pals.hoon)
40+ - [`rudder.hoon` for serving websites](https://github.com/Fang-/suite/blob/master/lib/rudder.hoon)
41+
42+ Our userspace code accessibility model should allow contributors from widely different skill levels to interact. We need to surface and document code patterns as cleanly as possible in the code we distribute. We need to include comments and unit tests so people can see how and why code works like it does.
43+
44+ Code accessibility cannot be an afterthought. We need to upgrade as much code as possible to A standards [per the style guide](https://developers.urbit.org/reference/hoon/style#grading).
45+
46+2. We need to improve the developer experience. Part of this involves better coding support, and part of this involves better debugging support.
47+
48+ To promote better coding, we should continue to develop IDE integrations like the Hoon Language Server. We've had some significant wins here, but rust never sleeps. We should also continue to produce userspace and middleware support libraries. We need to pay attention to how developer preferences are manifesting in their workflows and tooling.
49+
50+ Better error messaging and debugging support, perhaps even a framework for line-by-line code execution, would be invaluable. Upgrading Dojo and generator support is an easy win. Any tool friction is a sin and we need to track this and think about how to improve use.
51+
52+3. We need our open source culture to continue to develop in the sunlight. We need to highlight and communicate user stories for developer tools, new and old. We need to share these from inside of companies in the ecosystem. I'm not going to call for “best practices”—it's too early and that's too corporate—but tacit knowledge and horizontal skill transfer need to be encouraged through active pair programming and utilization of build parties and the like.
53+
54+ We need to expose how bugs occur, propagate, and are corrected. The core development team has committed to public [postmortems](https://github.com/urbit/urbit/issues/6583) when things go wrong.
55+
56+4. Ultimately, Urbit has to stay playful. Urbit makes programming, even systems programming, a lot of fun. Fun is open-ended and surprising. It allows for whimsy in code and product.
57+
58+Our developer onboarding and open source culture should be a model for the entire open source world. This is neither impossible nor impractical—we've made huge strides in legibility, and we're sailing with the wind.
59+
content/blog/hoon-4-lispers.md+96−53
@@ -1,6 +1,6 @@
11+++
2−title = "Hoon for Lispers"
3−date = "2023-06-13"
2+title = "A Perspective on Lisp and Hoon"
3+date = "2023-06-15"
44description = "Lisp is an éminence grise of programming. How does Hoon compare?"
55
66[extra]
@@ -13,40 +13,36 @@ image = "https://engineering.stanford.edu/sites/default/files/styles/card_1900x9
1313
1414> In the beginning, von Neumann created the machine. And the machine was with rigorous form and code, and no compiler yet moved upon the face of the tubes. And the evening and the morning were the first day.
1515>
16−> And John Backus said, Let there be FORTRAN, and there was FORTRAN. And FORTRAN ruled over the assembly.
16+> And John Backus said, Let there be FORTRAN, and there was Fortran. And Fortran ruled over the assembly.
1717>
1818> And John McCarthy saw the lambda calculus, that it was very good. And McCarthy made the LISP and divided the programmers who were for the array from the programmers who were for the list.
1919>
20−> And the FORTRAN and the LISP were the second day. And God set them in the firmament to give light upon the earth.
20+> And the Fortran and the Lisp were the second day. And God set them in the firmament to give light upon the earth.
2121
2222Two great temperaments of programming language design span these poles: Fortran as the engineer of assembler-first hard-nosed array coding and Lisp as the math professor running down to the machine room waving papers. While they have ceded some to the practicalities of the other over time, each is a trope of a particular computing paradigm. In this article, we will examine the Lisp pole in light of Urbit's development language, Hoon.
2323
2424Hoon is a statically typed functional programming language that is designed to be safe, efficient, and expressive. Hoon has a unique syntax relying heavily on symbolic expressions (using “runes”) rather than traditional keywords and operators. Hoon's underlying execution language, Nock, has been described as a “pico-Lisp“, making reference to its nature as a cell-based combinator calculus. Both languages (Nock and Hoon) follow very much in the philosophical steps of Lisp but seek to improve the genre.
2525
26−Lisp is known for its powerful macro system, which allows developers to write code that generates more code at compile time, and for its powerful `eval` statement; while Hoon provides a flexible metaprogramming system that allows developers to manipulate code at compile time and hot-swap code at runtime.
26+Lisp is known for its powerful macro system, which allows developers to write code that generates more code at compile time, and for its powerful `eval` function; while Hoon provides a flexible metaprogramming system that allows developers to manipulate code at compile time and hot-swap code at runtime.
2727
28−This article will contrast classical Lisp syntax and assumptions with Hoon's design. Three overarching design principles have yielded the necessary components of Hoon's characteristic structure:
28+This article will contrast classical Lisp syntax and assumptions with Hoon's design. As Lisp is a family of languages rather than a single implementation, I will strive to make generally applicable statements or qualify the discussion—I welcome nuance in your responses about the different major Lisp dialects.
29+
30+Hoon's characteristic structure has arisen from these overarching design principles:
2931
30321. Hoon must compile to Nock, and benefits from reflecting Nock's calculational worldview.
31332. Hoon must be capable of live upgrades; that is, conscious brain surgery on itself.
32−3. Hoon should grow organically based on actual developer usage patterns (and it did).
33−
34−(There has, of course, also been organic evolution as core developers discovered particular design patterns and designed appropriately concise syntax.)
34+3. Hoon should grow organically based on actual developer usage patterns.
3535
36−Our investigation of Lisp and Hoon will cover:
37−
38−1. Syntax
39−2. Metaprogramming
40−3. Philosophy
36+Our investigation of Lisp and Hoon will compare their syntax, their metaprogramming affordances, and their underlying philosophies.
4137
4238
4339## Syntax
4440
45−Hoon has many commonalities with Lisp and its most common calling convention is sugared to appear like Lisp. The syntax of Nock differs—e.g. using `[]` brackets instead of `()` parentheses—and Nock does not have non-numeric tokens or names. Hoon serves as a more human-friendly syntax which mediates common expressions and structures much as C overlays assembly language. For practical purposes, we never need to write Nock code by hand, and so while Nock informs Hoon's design choices, we don't need to understand any Nock to talk about Hoon.
41+Hoon has many commonalities with Lisp and its most common calling convention is sugared to appear like Lisp. The conventions of Nock differ—e.g. using `[]` brackets instead of `()` parentheses—and Nock does not have non-numeric tokens or names. Hoon serves as a more human-friendly syntax which mediates common expressions and structures much as C overlays assembly language. For practical purposes, we never need to write Nock code by hand, and so while Nock informs Hoon's design choices, we don't need to understand any Nock to talk about Hoon.
4642
4743Both Lisp and Hoon are homoiconic, meaning that code and data are directly represented the same way: Lisp code is represented as Lisp data structures, and Hoon code is represented as Hoon data structures. Homoiconicity means that code can be manipulated and transformed as data at runtime. While the most compelling investigation in this article focuses on metaprogramming, we need to start with a comparative syntax and grammar so we understand how code and data are represented.
4844
49−Before all of that, let us compare a simple program implemented in both Lisp and Hoon. Since both programming languages are functional languages that result in values and prefer to avoid side effects, we will not use a trivial “Hello World” example. Instead we will calculate the arithmetic mean of a set of numbers of known size.
45+Before all of that, let us compare a simple program implemented in both Lisp and Hoon. Both programming languages are species of functional languages for which expressions result in values, but they handle side effects differently: in Hoon side effects are strictly impossible (although a runtime workaround permits I/O and necessary effects), while in Lisp side effects are permitted (although opinions on their use vary). We will therefore not use a trivial “Hello World” example. Instead we will calculate the arithmetic mean of a set of numbers of known size.
5046
5147```scheme
5248(define (mean a)
@@ -73,9 +69,9 @@ Before all of that, let us compare a simple program implemented in both Lisp and
7369
7470The Scheme code has the advantage that it reads almost English-like as one works through the logic, but implicitly relies on familiarity with the `if`/`then`/`else` structure and function application using `()` (on which more soon).
7571
76−The Hoon code uses the `%` function application runes (differentiated by number of arguments) to apply the function calls. With syntactical sugar, this looks similar to the Lisp call, with `++roll` instead of `apply` and `++lent` instead of `length`.
72+The Hoon code uses the `%` function application runes (differentiated by number of arguments) to apply the function calls. With syntactic sugar, this looks similar to the Lisp call, with `++roll` instead of `apply` and `++lent` instead of `length`.
7773
78−Throughout I will use code examples for Lisp written in the Scheme dialect taken from [Rosetta Code](https://rosettacode.org/wiki/Category:Scheme). I will select or compose Hoon examples to be structurally similar to the Lisp code in order to facilitate comparison. I will also avoid sugar syntax that would obscure the structure of the Hoon code; in some cases this will make it slightly less readable than its equivalent in practice.
74+Throughout I will use code examples for Lisp taken from [Rosetta Code](https://rosettacode.org/wiki/Category:Scheme). I will select or compose Hoon examples to be structurally similar to the Lisp code in order to facilitate comparison. I will also avoid sugar syntax that would obscure the structure of the Hoon code; in some cases this will make it slightly less readable than its equivalent in practice.
7975
8076### Syntax in Lisp
8177
@@ -100,7 +96,7 @@ Lisp code, being dynamically typed, is inclined to try a value and see if it wor
10096
10197Lisp types are to some extent (justly) influenced by the underlying platform architecture: Lisp is generally compiled directly to machine code (like a C program), with the notable exception of [Clojure](https://clojure.org/reference/lisps) which runs on the Java Virtual Machine.
10298
103−#### Operators, Functions, and Macros
99+#### Operators, Functions, Macros, and Thunks
104100
105101Lisp syntax is characterized by its use of nested lists, called S-expressions (symbolic expressions), which consist of parentheses enclosing atoms or other S-expressions. The basic structure of an S-expression is an operator (or function) followed by its arguments, all enclosed in parentheses. For example, the following S-expression performs a simple arithmetic operation:
106102
@@ -108,11 +104,11 @@ Lisp syntax is characterized by its use of nested lists, called S-expressions (s
108104(+ 1 2 3)
109105```
110106
111−Lisp uses prefix notation, where the operator comes before the operands, and parentheses are used to group expressions. The S-expression is evaluated from left to right, with the operator being applied to its arguments.
107+Lisp uses prefix notation, where the operator comes before the operands, and parentheses are used to group expressions. The S-expression is evaluated from left to right (in most Lisps save Scheme), with the operator being applied to its arguments.
112108
113109Operators in Lisp operate on values of different basic types. Lisp dialects vary in their particular base types, but typically include numbers, strings, booleans, and so forth. The core data type is the list, of course (LISP is for LISt Processing). Since Lisp biases towards list processing, many operators are comfortable receiving an arbitrary number of values as inputs, as in the code sample above.
114110
115−In Lisp, [`cons`](https://en.wikipedia.org/wiki/Cons) describes the procedure to construct a pair of pointers to objects. This seemingly modest capability is fundamental to how Lisp builds lists—and since everything is a list, `cons` has consequences. One fundamental convention is the `cons` cell, which consists of pointers to two other Lisp objects and is how lists are actually constructed.
111+In Lisp, [`cons`](https://en.wikipedia.org/wiki/Cons) describes the procedure to construct a pair of objects. This seemingly modest capability is fundamental to how Lisp builds lists—and since everything is a list, `cons` has consequences. One fundamental convention is the `cons` cell, which consists of two other Lisp objects and is how lists are actually constructed.
116112
117113![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Cons-cells.svg/450px-Cons-cells.svg.png)
118114
@@ -132,7 +128,7 @@ SQUARE
132128
133129Lisp functions are first-class objects and can be manipulated and passed like values of basic types as well.
134130
135−Before we can look at macros, we need to consider Lisp's notion of evaluation and in particular deferred evaluation. For Lisp, an expression can be marked as a literal value rather than evaluated to produce a result. The quote `'` symbol is used to mark expressions for such deferred evaluation:
131+Before we can look at macros, we need to consider Lisp's notion of evaluation and in particular deferred evaluation. For Lisp, an expression can be marked as a literal value rather than evaluated to produce a result. The quote `'` symbol is used to mark expressions for prevented evaluation:
136132
137133```lisp
138134'(1 2 3) ; evaluates to the list (1 2 3)
@@ -149,7 +145,7 @@ Backtic or backquote `` ` `` allows you to switch an expression in and out of ev
149145`(1 ,(+ 2 3)) ; evaluates to the list (1 5)
150146```
151147
152−A Lisp macro differs slightly from a function in that it uses deferred evaluation to produce an example later.
148+A Lisp macro is essentially a compile-time function.
153149
154150```lisp
155151> (defmacro square (x)
@@ -162,9 +158,25 @@ A Lisp macro differs slightly from a function in that it uses deferred evaluatio
162158
163159(The `` ` `` notation constructs the expression with values spliced in by `,`.)
164160
165−In Lisp, the `eval` operator is used to evaluate a Lisp expression that is represented as a data structure. It takes a single argument, which is a Lisp expression, and returns the value of that expression.
161+A deferred evaluation, called a thunk, is a closure that inherits its lexical environment but is deferred for later computation. Thunks enable lazy code evaluation and separate the computation’s definition from its execution.
162+
163+```lisp
164+(defun create-thunk (function &rest arguments)
165+ (lambda () (apply function arguments)))
166+
167+(defun invoke-thunk (thunk)
168+ (funcall thunk))
166169
167−The `eval` operator is a powerful tool in Lisp, because it allows Lisp programs to manipulate and evaluate Lisp code dynamically at runtime. This means that Lisp programs can generate new code and evaluate it on the fly, allowing for a high degree of flexibility and adaptability.
170+;; Creating a thunk that calculates the factorial of a number
171+(defvar factorial-thunk (create-thunk #'(lambda () (factorial 5))))
172+
173+;; Invoking the thunk to get the result
174+(print (invoke-thunk factorial-thunk)) ; Output: 120
175+```
176+
177+In this code example, `create-thunk` accepts a function and returns a thunk created using a lambda function to encapsulate the computation. `invoke-thunk` is used to invoke the thunk to get the actual result. The actual application creates a deferred factorial implementation and then finally invokes it. Without the last line, the actual calculation would never be executed.
178+
179+As Paul Graham wrote, “The unusual thing about Lisp-- in fact, the defining quality of Lisp-- is that it can be written in itself.” A Lisp program is an S-expression, and in principle we can run the equation the other way: certain S-expressions are valid Lisp programs. Although uncommon in practice due to code safety issues, the `eval` function is illustrative of Lisps’ ability to evaluate a Lisp expression that is represented as a data structure. It takes a single argument, which is a Lisp expression, and returns the value of that expression. Lisp programs can in principle generate new code—or modify existing code—and evaluate it on the fly, since code is data.
168180
169181```lisp
170182(defvar x 10)
@@ -174,8 +186,6 @@ The `eval` operator is a powerful tool in Lisp, because it allows Lisp programs
174186(eval z)
175187```
176188
177−`eval` lets us resolve the deferred expression when we are ready to use it. Code introspection in Lisp is straightforward because of deferred evaluation: one can look inside of a function to see how it works.
178−
179189Besides explicitly named functions and macros, Lisp frequently employs lambda expressions to produce functions on demand at the point of use.
180190
181191```lisp
@@ -246,7 +256,7 @@ A cell is a pair of two nouns, and of course many compound types exist, includin
246256
247257Hoon expressions are ultimately binary trees of cells and atoms—Hoon is homoiconic and so code is directly represented as a data structure which can be interpreted as a value as well. This facilitates Hoon's ability to upgrade itself in place, as we will see.
248258
249−Hoon implements types as _molds_, or functions which coerce to type or crash. A mold is a way of asserting known type information over a value, typically at compile time, in a way that allows for data transformation and data validation. This leads to some interesting cases such as the difference between a null-terminated tuple and a true list, which some functions require.
259+Hoon commonly implements types structurally via _molds_, or functions which coerce to type or crash. A mold is a way of asserting known type information over a value, typically at compile time, in a way that allows for data transformation and data validation. This leads to some interesting cases such as the difference between a null-terminated tuple and a true list, which some functions require.
250260
251261```hoon
252262> ~[1 2 3]
@@ -303,16 +313,16 @@ A `vase` can be used at runtime to resolve a value from a dynamic context into a
303313
304314#### Expressions
305315
306−Nock explicitly consists of binary trees, since any Nock structure or program consists entirely of atoms (bare values) and cells (pairs of nouns). Although Hoon ultimately compiles to Nock, it is more natural in some ways to approach the syntax of a program as an array of $n$-ary trees, where each “slot” in an expression can have zero, one, or many children. (Zero children refers to a tree address containing a terminal value like a symbol or an integer.)
316+Nock explicitly consists of binary trees, since any Nock structure or program consists entirely of atoms (bare values) and cells (pairs of nouns).
307317
308−image here TODO
318+![](https://storage.googleapis.com/media.urbit.org/docs/userspace/hoon-school/binary-tree.png)
309319
310320Expressions are oriented around runes, which act as operators to join or manipulate expressions. To construct a cell of two values like `1` and `2`, one uses the `:-` cencol rune. (Hoon cells implement what we call an “implicit `cons`”, meaning that two nouns composed together are simply unified in a shared binary tree.)
311321
312322```
313323 :-
314324 / \
315−1 2
325+1 2
316326```
317327
318328To invoke a function named `add`, one can provide a `%-` cenhep rune with the function name and the arguments.
@@ -321,8 +331,8 @@ To invoke a function named `add`, one can provide a `%-` cenhep rune with the fu
321331 %-
322332 / \
323333add :-
324− / \
325− 1 2
334+ / \
335+ 1 2
326336```
327337
328338We write this Hoon expression one of two ways, either separated by whitespace or using parentheses:
@@ -344,6 +354,8 @@ Hoon employs “sugar syntax” for many common code patterns to make them easie
344354
345355which results in basically the same expression once the parser is done.
346356
357+(Although Hoon ultimately compiles to Nock, it is more natural in some ways to approach the syntax of a program as an array of $n$-ary trees, where each “slot” in an expression can have zero, one, or many children. Zero children refers to a tree address containing a terminal value like a symbol or an integer.)
358+
347359Rune syntax is Hoon's answer to the Lisp proliferation of parentheses—by restricting expressions to a definite number of children, Hoon avoids needing to explicitly terminate most expressions. In some ways, runes are an ASCII-based equivalent of APL's symbolic character operators.
348360
349361```apl
@@ -380,18 +392,18 @@ The next examples explore an interesting difference between Lisp `cond` and Hoon
380392 %typical-midwest
381393++ symbol-to-message
382394 |= msg=term
383− ?+ msg 'Typical Midwest'
384− %too-hot
385− 'Too hot outside'
386− %nice
387− 'Nice outside'
388− %too-cold
389− 'Too cold here'
395+ ?+ msg 'Typical Midwest'
396+ %too-hot
397+ 'Too hot outside'
398+ %nice
399+ 'Nice outside'
400+ %too-cold
401+ 'Too cold here'
390402 ==
391403--
392404```
393405
394−Lisp expects a program to be a running series of expressions, naturally composed together as a list. Hoon, in contrast, requires everything to be a binary tree: thus, series of expressions must be composed together, e.g. using `=>` tisgar to concatenate two expressions.
406+Lisp expects a program to be a running series of expressions, naturally composed together as a list. Hoon, in contrast, expects everything to be an evaluable expression (no implicit `progn`, for instance): thus, series of expressions must be composed together, e.g. using `=>` tisgar to concatenate two expressions.
395407
396408This code example defines an expression and immediately evaluates another expression against it:
397409
@@ -426,6 +438,8 @@ Hoon has much more syntactic sugar than Lisp. Not only is the Lisp-like `()` ex
426438
427439This gives a Hoon developer an extreme amount of flexibility in constructing and laying out code expressions. In fact, many Hoon programs read as a hybrid of imperative code and functional code, since the ability to lay out intent line-by-line feels rather like C.
428440
441+Hoon conventions and sugar syntax have evolved organically as core developers discovered or invented useful design patterns and appropriately concise syntax.
442+
429443#### Functions (Gates) and Cores
430444
431445The most important structural concept in Hoon is the core, which organizes code into a binary tree of `[code data]`, or as we call it in Hoon, `[battery payload]`. Since cores have a standard structure, this means that many kinds of direct manipulations (metaprogramming) are possible, such as altering the input arguments to a function or manipulating the code variance model. Cores play a role in Hoon similar to that of objects in many other languages.
@@ -514,7 +528,7 @@ The nature of cores derives from Nock and is key to understanding how Hoon works
514528--
515529```
516530
517−Although Lisp's `'` quote deferred evaluation operator has no direct equivalent in Hoon, there are a couple of structures that can provide a similar effect. The most important of these is the `|.` trap, which defines an expression to be evaluated at a later time. For instance, traps are used when testing code that _should_ fail, as the expression can be defined and deferred until the test framework is ready to process it.
531+Although Lisp's `'` quoting has no direct equivalent in Hoon, there are a couple of structures that can provide a similar effect. The most important of these is the `|.` trap, which defines an expression to be evaluated at a later time—Hoon’s equivalent of Lisp’s thunk. For instance, traps are used when testing code that _should_ fail, as the expression can be defined and deferred until the test framework is ready to process it.
518532
519533```hoon
520534> =foo |.((add 1 41))
@@ -541,11 +555,44 @@ To use `++turn`, we need a list and a transformation function. The type of the
541555
542556Wet gates are therefore used when incoming type information is not well known and needs to be preserved. This includes parsing, building, and structuring arbitrary nouns. (Beyond Lisp analogues, you can think of C++'s templates and operator overloading, and Haskell's typeclasses.)
543557
558+This example compares the Lisp deferred factorial thunk with an equivalent Hoon trap. (Hoon includes `++factorial` since it is not part of the standard library.)
559+
560+```scheme
561+(defun create-thunk (function &rest arguments)
562+ (lambda () (apply function arguments)))
563+
564+(defun invoke-thunk (thunk)
565+ (funcall thunk))
566+
567+;; Creating a thunk that calculates the factorial of a number
568+(defvar factorial-thunk (create-thunk #'(lambda () (factorial 5))))
569+
570+;; Invoking the thunk to get the result
571+(print (invoke-thunk factorial-thunk)) ; Output: 120
572+```
573+
574+```hoon
575+=>
576+|%
577+++ factorial
578+ |= n=@ud
579+ |-
580+ ?: =(n 1) 1
581+ %+ mul n
582+ %= $
583+ n (dec n)
584+ ==
585+++ factorial-5
586+ |. (factorial 5)
587+--
588+(factorial-5)
589+```
590+
544591### Subject-Oriented Programming
545592
546593Urbit programming employs a paradigm deriving from the nature of Nock (_a fortiori_ Hoon), subject-oriented programming. Every expression of Hoon is evaluated relative to its subject, a piece of data that represents the environment, or the context, of an expression.
547594
548−The subject refers to the parent binary tree of an expression, more or less, and serves as state, lexical scope, environment, and function argument. (We can be precise about the definition in all cases—e.g. the subject of a gate in a core is the core itself—but don't need to for this essay.) The compile-time environment in ([some dialects of](https://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Scoping.html)) Lisp has dynamic extent, such that any part of the program can access a particular binding. Hoon's subject-oriented programming model takes this even further: since code and data share the same representation, and code is a binary tree, any part of the subject is available in principle.
595+The subject refers to the parent binary tree of an expression, more or less, and serves as state, lexical scope, environment, and function argument. (We can be precise about the definition in all cases—e.g. the subject of a gate in a core is the core itself—but don't need to for this essay.) Lisp supports variable scope and global variables, such that any part of the program can access a particular binding. Hoon's subject-oriented programming model naturally provides its equivalent of scope: all code is evaluated against a subject and name bindings proceed by depth-first match (with permitted skips to prevent unwanted masking).
549596
550597> Subject orientation in Nock and Hoon stems partly from minimalism (there's just one subject, which serves as state, lexical scope, environment, and function argument), partly from a desire to simplify compilation (the type of the subject is a full specification of the compile-time environment for a source file), and partly in order to give the language a more imperative feel.
551598>
@@ -575,7 +622,7 @@ because the `++add` gate is not defined in the subject against which the express
575622
576623```scheme
577624(define index-of
578− (lambda (needle hackstack)
625+ (lambda (needle haystack)
579626 (let ((tail (member needle haystack)))
580627 (if tail
581628 (- (length haystack) (length tail))
@@ -635,21 +682,17 @@ A Lisp program is really a list, or a list of lists (nested as much as necessary
635682
636683### Metaprogramming in Lisp
637684
638−Metaprogramming is the practice of writing code that manipulates other code at either compile-time or runtime. In Lisp, metaprogramming is a core feature of the language, and it allows developers to create programs that are incredibly powerful and flexible. Lisp's metaprogramming capabilities are primarily built on two features: macros and the consequent ability to manipulate the language's own syntax.
685+Metaprogramming is the practice of writing code that manipulates other code at either compile-time or runtime. In Lisp, metaprogramming is a core feature of the language, and it allows developers to create programs that are incredibly powerful and flexible. Lisp's metaprogramming capabilities are primarily built on two features: macros and syntax manipulation.
639686
640687Macros in Lisp are a way to define new language constructs that are more expressive and more powerful than those provided by the language itself. When a Lisp program is compiled or interpreted, macros are expanded into regular Lisp code, allowing the macro to generate new code based on its input arguments. Since Lisp code is represented as data, it can be manipulated using the same functions and operators used to manipulate other data structures.
641688
642689For instance, Lisp macros could allow you flexibility in expressing a common operation. Imagine you're working on a project that requires a lot of complex math calculations. Rather than writing out each calculation manually, you could define a macro that takes an expression in infix notation (e.g. `2 + 3 * 4`), and transforms it into a Lisp expression that can be evaluated directly. Thus you could compose math expressions in a more human-natural way without having to worry about details of Lisp syntax.
643690
644−Lisp can also manipulate its own syntax is through the use of reader macros. Reader macros are similar to regular macros, but they operate at the level of the Lisp reader, which is responsible for converting textual input into Lisp expressions. Reader macros can be used to extend the syntax of Lisp in powerful ways, allowing developers to define new syntax for specific types of data or operations. For example, imagine you're working on a project that requires parsing a lot of complex data files. Rather than writing a lot of custom parsing code, you could define a reader macro that takes a specific input format (e.g. JSON or YAML), and transforms it into a Lisp expression that can be directly manipulated by your code.
645−
646−(Hoon can accomplish something similar via parsing, but not at the level of the Hoon language input.)
647−
648−In Lisp, code is represented as lists of symbols and expressions, which means that the syntax of the language can be easily manipulated and transformed using standard Lisp functions.
691+Lisp can also manipulate its own syntax. This is sometimes done through the use of reader macros, which operate at the level of the Lisp reader, which is responsible for converting textual input into Lisp expressions. Reader macros can be used to extend the syntax of Lisp, allowing developers to define new conventions or domain-specific languages for specific types of data or operations. Beyond reader macros, Lisp can permit the developer to change the parser (and as long as the result is a Lisp expression, the interpreter or compiler will be fine with this). Top-level functions can be replaced or modified (“advised”). Symbol macros can change source code.
649692
650−Lisp's `'` quote and the `eval` statement allow single expressions to be deferred or evaluated at will, which is incredibly useful when dealing with symbols that may not be defined yet or in the composition of macros.
693+Lisp's `'` quote and the `eval` statement allow single expressions to be inhibited or evaluated at will, which is incredibly useful when dealing with symbols that may not be defined yet or in the composition of macros.
651694
652−In addition to macros and syntax manipulation, Lisp dialects typically provide a number of other features that make metaprogramming easier, such as the ability to inspect and modify the runtime environment, and the ability to redefine functions and classes at runtime. Code reflection allows runtime creation of functions or macros (as at the REPL).
695+In addition to macros and syntax manipulation, Lisp dialects typically provide a number of other features that make metaprogramming easier, such as the ability to inspect and modify the runtime environment, and the ability to create or redefine functions and classes at runtime.
653696
654697### Metaprogramming in Hoon
655698
@@ -696,7 +739,7 @@ Hoon's focus on atoms, static typing, and symbolic expressions make it a highly
696739
697740Lisp has evolved greatly since John McCarthy's founding. Like Unix, a complicated family tree has finally settled down into a few strong contenders: Scheme, Common Lisp, Clojure, Racket.
698741
699−Lisp has tended to be fractious: as many have noted, and [Mark Tarver eloquently expressed](http://web.archive.org/web/20080803193859/http://www.lambdassociates.org/blog/bipolar.htm), the Lisp platform appeals to complete implementation of idiosyncratic vision. There's a looseness in the community's coherence as a result.
742+Lisp has tended to be fractious: as many have noted, and [Mark Tarver eloquently expressed](http://web.archive.org/web/20080803193859/http://www.lambdassociates.org/blog/bipolar.htm), the Lisp platform appeals to idiosyncratic visions for completist platforms. There's a looseness in the community's coherence as a result.
700743
701744For a few reasons, the Urbit community has managed to avoid such splintering (the [Urbit Classic joke](http://urbit-classic.org/) aside). With a single sponsoring organization, first Tlon Corporation and since 2022 the Urbit Foundation, to steward the ecosystem and a philosophical commitment to protocol-as-platform, Urbit should avoid partition into competing bazaars.
702745
content/communities/urbit-paris.mdnew file+23
@@ -0,0 +1,23 @@
1++++
2+title = "Urbit Paris"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbitparis.png"
5++++
6+
7+Join us for our monthly Urbit meetups in Paris!
8+
9+Whether you're a tech enthusiast, an established Urbit aficionado, or a newcomer to the scene, our community is meant to welcome and engage everyone.
10+
11+If you're confused about what Urbit is, no worries, most people are at first. Drop by and we'll give you our best explanations of what Urbit is and how it's going to change the internet as we know it.
12+
13+We'll introduce Urbit, help you boot your own ship, and make sure you go back home all set!
14+
15+See you there!
16+
17+––
18+
19+~solsup-soplyd/urbit-paris
20+
21+[Twitter](https://twitter.com/urbitparis)
22+
23+[Meetup](https://www.meetup.com/urbit-paris/)
content/events/2023-06-24-urbit-meetup-christchurch.mdnew file+24
@@ -0,0 +1,24 @@
1++++
2+title = "Urbit Meetup - Christchurch"
3+starts = "2023-06-24T10:30:00"
4+ends = "2023-06-24T12:00:00"
5+timezone = "Pacific/Auckland"
6+location = "363 St Asaph Street, Christchurch"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-christchurch.jpg"
8+registration_url = "https://www.meetup.com/urbit-christchurch/events/294172584/"
9+description = ""
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+patp = "~dinnul-namrud"
15+
16++++
17+
18+The next meetup in Christchurch is at The Lotus Heart on the 24th June at 10:30am. Stick around afterwards for a drink and bite to eat if you desire.
19+
20+Please [RSVP](https://www.meetup.com/urbit-christchurch/events/294172584/) to the Meetup. Friends are most welcome!
21+
22+
23+
24+
content/events/2023-06-29-Urbit-Paris-Meetup-1.mdnew file+30
@@ -0,0 +1,30 @@
1++++
2+title = "Urbit Meetup in Paris"
3+starts = "2023-06-29T18:30:00"
4+ends = "2023-06-29T21:30:00"
5+timezone = "Europe/Amsterdam"
6+location = "La Fièvre, 108 Rue Oberkampf, 75011 Paris"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/urbitParis-meetup-1.png"
8+registration_url = "https://www.meetup.com/urbit-paris/events/293962806/"
9+description = "Urbit Paris - Meetup #1"
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+name = ""
15+patp = "~solsup-soplyd"
16+
17++++
18+Curious what the future of the Internet looks like?
19+
20+Join us on June 29th in Paris!
21+
22+Whether you're a tech enthusiast, an established Urbit aficionado, or a newcomer to the scene, our community is meant to welcome and engage everyone.
23+
24+If you're confused about what Urbit is, no worries, most people are at first. Drop by and we'll give you our best explanations of what Urbit is and how it's going to change the internet as we know it.
25+
26+We'll introduce Urbit, help you boot your own ship and make sure you go back home all set!
27+
28+In the meantime, you can join us on [Twitter](https://wwww.twitter.com/urbitparis)!
29+
30+See you there!
content/events/2023-07-01_urbit-meetup-mst.mdnew file+23
@@ -0,0 +1,23 @@
1++++
2+title = "Urbit Meetup - Utah MST"
3+starts = "2023-07-01T10:00:00"
4+ends = "2023-07-01T11:00:00"
5+timezone = "America/Phoenix"
6+location = "Maeser Park – 451 E 600 S, Provo, UT 84606"
7+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-utah.png"
8+registration_url = "https://urbitmst.org/"
9+description = "Our third meetup in Utah"
10+dark = true
11+darken_image = "true"
12+
13+[[hosts]]
14+name = "Lyman"
15+patp = "~sonmeg-tomdex"
16+
17++++
18+
19+Are you looking for more than the options presented to you?
20+
21+Come to our Urbit (MST) meetup. All are welcome. Bring a computer and we can onboard you with a planet and hosting for free on site. Whether you are new to Urbit or fluent in Hoon, come and meet others in Utah interested in Urbit.
22+
23+This will be our first morning meetup, we will have donuts. Bring your friends. You are invited.
content/events/2023-07-20-Urbit-Paris-Meetup-ethcc.mdnew file+53
@@ -0,0 +1,53 @@
1++++
2+title = "𝓣𝓱𝓮 𝓢𝓾𝓶𝓶𝓮𝓻 𝓢𝓸𝓲𝓻𝓮𝓮 - Paris ETHCC"
3+starts = "2023-07-20T19:00:00"
4+ends = "2023-07-21T1:00:00"
5+timezone = "Europe/Amsterdam"
6+location = "Le Comptoir Général"
7+image = "https://storage.googleapis.com/media.urbit.org/site/events/parisian-tweet-v2.gif"
8+registration_url = "https://lu.ma/parissoiree"
9+description = "Urbit Summer Soiree Paris @ETHCC"
10+dark = true
11+darken_image = "false"
12+
13+[[hosts]]
14+name = "Thomas"
15+patp = "~dalweb-donfun"
16+
17+[[hosts]]
18+name = "Ted"
19+patp = "~rovnys-ricfer"
20+
21+[[hosts]]
22+name = "Sam"
23+patp = "~tidren-nosryg"
24+
25+[[hosts]]
26+name = "Shad (giga)"
27+
28+[[guests]]
29+name = "Illia (co-founder Near)"
30+
31++++
32+Presented by Urbit | giga | NEAR
33+​An evening of salacious chatter and good friends under the night sky and the peering eye of the tower.
34+
35+​Join us on July 20th with other like minds as we manifest the reality around us, drinking and eating till we can no more.
36+
37+​At 19:30 we will record a live episode of the [ZeroK podcast](https://www.youtube.com/@zero-k-podcast/videos) between [Ted Blackman](https://twitter.com/rovnys) (CTO Urbit Foundation) & [Illia Polosukhin](https://twitter.com/ilblackdragon) (CEO Near).
38+
39+​RSVP necessary.
40+
41+*​NB. Due to high demand, please [signup](https://lu.ma/parissoiree) early and consider coming before 19:45 to avoid any disappointment.*
42+
43+![Foto](https://storage.googleapis.com/media.urbit.org/site/events/luma-parisian-event.jpg)
44+
45+​“In the parties which she gave, since I could not imagine the guests as having any bodies, any moustaches, any boots, as making any utterances that were commonplace, or even original in a human and rational way, this whirlpool of names, introducing less material substance than would a phantom banquet or a spectral ball, round that statuette in Dresden china which was Madame de Guermantes, kept for her palace of glass the transparence of a showcase.
46+
47+​Then, after Saint-Loup had told me various anecdotes about his cousin’s chaplain, her gardener, and the rest, the Hôtel de Guermantes had become—as the Louvre might have been in days gone by—a kind of castle, surrounded, in the very heart of Paris, by its own domains, acquired by inheritance, by virtue of an ancient right that had quaintly survived, over which she still enjoyed feudal privileges.”
48+
49+[​Urbit](https://urbit.org/) is a new kind of computer that you can own completely in ways that matter: networking, identity, & data. It's a clean-slate operating system, p2p network and persistent identity.
50+
51+[​giga](https://gigaver.se/) is a hardcore marketing and ecosystem firm bringing projects and networks to the spotlight. Email us today to learn how we take projects from the deep dark depths and put them on a pedestal.
52+
53+[​NEAR](https://near.org/) allows you to effortlessly create and distribute innovative decentralized apps across any blockchain, while helping build a more open web, with the NEAR Blockchain Operating System (BOS).
content/grants/2022/chess-bounty.md+2
@@ -49,4 +49,6 @@ Never say never, but there is a strong preference for 3 novice developers to wor
4949# Milestones and Compensation
5050Each of the three Deliverables above is a milestone. However, since the reward is 3 stars and designed to be completed by a 3-person team, it seems likely that the compensation schedule would be "1 star per person upon full completion". Specific details will be agreed upon with the contributor team prior to starting work.
5151
52+**Bonus** 3 additional stars will be paid to the contributors (1 each) if work is completed before October 2023
53+
5254
content/grants/2023/aera.mdnew file+50
@@ -0,0 +1,50 @@
1++++
2+
3+title = "Aera"
4+date = "2023-06-08"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "A decentralized, subjective reputation graph protocol."
13+reward = "8 Stars + Bonus"
14+assignee = ["~talwet"]
15+champion = ["~dalten"]
16+grant_id = "P0276"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# A new Aera of reputation
23+
24+Aera is an essential missing piece of Urbit infrastructure which will bring self-sovereign trust to the platform. This will enable application developers to manage, filter, curate, and otherwise manage context dependent trust parameters within their products. Additionally, the fully formed version of Aera will include an interface for users to view and understand the shape of their trust graph. Aera makes it possible to build applications that can’t be built using the current web stack. For a more detailed view of the Aera value prop and future product updates, please visit https://quartus.co/aera
25+
26+# Team
27+Aera is a project consisting of many Urbit community members. It is the brainchild of ~rabsef-bicrym, but will also include the following key contributors:
28+- ~litlep-nibbyt, working on hoon agents
29+- ~normul-postem, writing frontend interfaces
30+- ~litneb-maltyp, designing graphical user interface & visual content
31+
32+Additionally, the project has a variety of other advisors and participants, including ~sarlev-sarsen, ~sicdev-pilnup, ~sogrum-savluc, and ~datnut-pollen. For anyone interested in participating, download the %aera desk to learn more: /1/desk/~dister-dozzod-dalten/aera
33+
34+# Milestones & Compensation
35+This proposal is going to be partially funded by the Urbit Foundation, both by a $10,000 direct commitment, as well as a grant of 8 stars to be released along the below milestones. Additionally, Aera will also grow to include a crowdfunding campaign using %fund to support ongoing development efforts from the Urbit community. Contributors will recieve early reputation scores within the resulting reputatation graph, as well as early access to developer resources and integration support. Funds will be held in escrow by the ~dalten collective, to be paid out to contributors upon milestone completion as determined by the members of the collective.
36+
37+## Milestone 1: Initial Research and Mathematical Modelling - $10,000
38+Quartus will conduct initial research efforts to understand implementation hurdles and ideal mathematical models for the shape of the aera agents and ‘trust-reduction algorithm’. This work will be released on an ongoing basis to the Aera group, hosted by ~dalten. Bi-weekly meetings will also be held and made accessible to campaign funders.
39+
40+## Milestone 2: Agent and Library Concept Creation - 2 stars
41+Quartus will begin development of the %aera agents and library and will release them to donors for feedback. Participants will receive a chance to provide feedback on agent architecture and use case requirements.
42+
43+## Milestone 3: Release Candidate Available to Developers for Feedback - 2 stars
44+Whitelisting of select developers, including all donors, for downloading of the %aera desk, including fully functioning agents and a working library. Participants will receive a chance to provide feedback on specific implementation details.
45+
46+## Milestone 4: Final Library and General Availability to Urbit Network - 2 stars
47+Developer feedback integrated into Milestone 3 release candidate and final library released to developers along with documentation. Quartus will work with donors through onboarding sessions that will guide developers through the integration of Aera with an urbit application. Additionally, the application will be made available to the network such that end users will be able to experience the product functionality via an example integration in %fund.
48+
49+## Milestone 5: Full Release to the network with End User GUI - 2 stars
50+Quartus will develop a frontend experience for users to explore their own view of the Aera graph. This GUI will include views of the users own ship, as well as their understanding of the nodes to which they are connected.
content/grants/2023/elm.mdnew file+68
@@ -0,0 +1,68 @@
1++++
2+
3+title = "Elm"
4+date = "2023-06-08"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Making Elm the frontend technology for Urbit"
13+reward = "5 Stars + Bonus"
14+assignee = ["~racfer-hattes"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0275"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description
23+
24+I think Elm is a great language for developing frontends. The Elm architecture is conceptually very similar to how %gall agents are structured.
25+
26+Goals:
27+
28+1. Remove the need to convert to and from JSON to interact with Urbit from Elm
29+2. Make interacting with Urbit from Elm as painless as possible
30+
31+To eliminate the need to convert through JSON Elm needs to support serializing and deserializing jammed nouns.
32+
33+For potential portability reasons Elm libraries are not allowed to have JS FFI. This means that we need to implement as much as possible in pure Elm.
34+
35+# Milestones and Compensation
36+
37+## Milestone 1: Jam and Nouns
38+
39+Reward: 2 Stars
40+
41+Deliverables:
42+ - An Elm library that implements `++jam` and `++cue` in Elm.
43+ - An Elm library for manipulating Nock Nouns and converting Elm data structures and type to and from Nock Nouns.
44+
45+## Milestone 2: Noun Channels
46+
47+Reward: 1 Star
48+
49+Deliverables: An Elm airlock library that supports subscriptions and pokes encoded as jammed Nouns. The library should be designed to be as ergonomic as possible.
50+
51+## Milestone 3: Documentation and Project Template
52+
53+Reward: 1 Star
54+
55+Deliverables:
56+ - Good documentation for resulting the package + a set of tutorials that cover some tricky bits.
57+ - A git repo with all of the boilerplate required to communicate with Urbit. This repo is intended to be used by ASL students to bootstrap their project frontend.
58+
59+## Milestone 4: SSS
60+
61+Reward: 1 star
62+
63+Deliverables: An Elm airlock library that supports Solid-state subscriptions.
64+
65+## Bonus
66+
67+Upon successful completion of project, the contributor will also receive a 6K USDC bonus funded by Vaporware
68+
content/grants/2023/json-parser-suite.md+1−1
@@ -14,7 +14,7 @@ reward = "2 Stars"
1414assignee = ["~litlep-nibbyt"]
1515champion = ["~lagrev-nocfep"]
1616grant_id = "P0245"
17−completed = false
17+completed = true
1818canceled = false
1919
2020+++
content/grants/2023/mapping-ids.mdnew file+106
@@ -0,0 +1,106 @@
1++++
2+
3+title = "Mapping Urbit IDs to Web 2 Domains"
4+date = "2023-06-13"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "5 Stars"
14+assignee = ["Web23"]
15+champion = ["~rovnys-ricfer"]
16+grant_id = "P0262"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Overview
23+
24+Urbit has a striking design that makes Urbit IDs scarce, full of utilities and many more new use cases would evolve around them.
25+
26+Urbit IDs also have an analogy with the Unix file systems where hostname resolves to the loopback address of the localhost. Further, an address will be reachable via network packets as well as be accessible via a local naming system.
27+
28+This structure of hostnames mapped with the IP addresses evolved to DNS at large. Urbit is perfectly aligned to evolve Urbit IDs into a true decentralized DNS structure.
29+
30+Domain names run over Web2 stack & current technological stack is in a transition state. For example, Web3 domains, let’s say john.eth or john.crypto are not recognized by the existing DNS and hence the resolvers & browsers. Typing john.eth in Chrome will not take a user to john.eth even if a dAPP is running over john.eth
31+
32+Additionally, with the Decentralized Identifiers (DIDs) evolving as the perfect way to identify the assets over the chain, it becomes imperative to look-up for DIDs and resolve them for multiple use cases.
33+
34+To fill the technical discontinuity amongst Web2 domainers & Web3 domainers, we propose a hinge between Urbit IDs & Web2 domains and also propose to build the DID resolver.
35+
36+# Why?
37+ - Web2 domains still serve as the starting points for most of the things on the Internet. (Even when Web3 products start their journey, maybe one of the first steps is to register a Web2 domain.)
38+ - People across the world know, understand & value Web2 domains more than any other thing (for example, a dot com)
39+ - There are millions of Web2 domainers who have no idea of Web3 landscape & considering them the long tail it is far more easier to use Web2 domains and nudge them towards Web3
40+
41+# The Proposal
42+
43+1. Chain agnostic Web23 domain centric wallet, first of it’s kind with the capabilities of Ethereum, Solana, Hedera Hashgraph to allow:
44+1
45+ - Existing Web2 domainers (likes of .com, .link) to explore, mint new Urbit IDs (from within the wallet) - pulled via GoDaddy, Tucows etc.
46+ - Existing Web3 domainers (likes of .eth, .sol, .hbar) to explore, mint new Urbit IDs (from within the wallet)
47+2. Decentralized application with the web interface to allow minting of new Urbit IDs via:
48+ - Web2 domains pulled over GoDaddy & Web3 domains pulled via Metamask (for Ethereum) or Phantom (for Solana) or Blade (for Hedera Hashgraph)
49+3. Integrated DID resolver:
50+ - To be accessed within the entire galaxy/ships of Urbit - an application layer in the form of NPM based libraries - could be used by all the calls/requests
51+ - To be accessed within the Web23 wallet as eventually DIDs would be the best fit & initial hook for the wallet - allowing end users to map multiple assets along with their DIDs
52+
53+# Timeline and Compensation
54+
55+This proposal will be completed in multiple phases, beginning with:
56+
57+Web23 wallet in the form of Chrome Extension for the Urbit community with the capabilities to map Web2 domains + Web3 domains of Ethereum, Solana, Hedera Hashgraph, Concordium along with the Urbit IDs:
58+ - Option to buy new Urbit IDs
59+ - Option to configure existing Urbit IDs
60+ - Access to Urbit IDs via sub-domains of the existing Web2 domains in question. For example, john.com may have ~Urbit ID.john.com
61+ - Option to exchange DMs (Direct Messages) within the wallet amongst each other
62+
63+Timeline: 8 weeks from start of project
64+
65+Reward: 5 Stars
66+
67+# Future Work
68+
69+The next two phases of work will consist of:
70+
71+1. Web based decentralized application to allow Web2 domain holders + Web3 domain holders of Ethereum, Solana, Hedera Hashgraph & Concordium to:
72+ - Map their existing Urbit IDs with the Web2 or Web3 domains (as indicated above)
73+ - Buy new Urbit IDs
74+ - Configure Urbit IDs
75+ - Decentralized application to allow connectivity for the respective wallets of the chains (one wallet each chain)
76+ - Exchange DMs using the Urbit IDs as hook and accessible over decentralized application
77+
78+
79+2. Integration of DID Resolver for Urbit allowing:
80+ - Ships to resolve to DIDs
81+ - Web23 wallet to resolve DIDs since Urbit IDs would be mapped to the
82+wallet
83+ - Decentralied apps to resolve DIDs
84+
85+# Overall Benefits
86+
87+ - Web2 domains get coupled with Urbit IDs for future sign-ups over dApps - for enhanced utilities of Urbit IDs
88+ - Insertion of Urbit IDs into the zone files of Web2 domains - for future readiness when DNS resolvers may have to query about the Urbit IDs
89+ - Easy access of Urbit IDs or dApp running web pages via integrated hosting services. For example, ravmel-ropdyl.john.com if Urbit ID ~ravmel-ropdyl creates a hinge with john.com
90+ - Integration of DID resolving part from within the proposed Web23 wallet- allowing users to keep & manage Urbit IDs, DIDs, Web2 domains and even Web3 domains -lying over Ethereum, Solana & Hedera Hashgraph
91+ - Push of Urbit IDs to all the Web2 domainers
92+
93+# Why Us?
94+
95+ - Our core expertise & experience run in decades of man hours in the Unix/Linux & domains, DNS at large
96+ - [Web23](https://web23.io/) is one of the grantees of Hedera Hashgraph - we have developed complete naming system for .hbar and various project TLDs over Hedera
97+ - Web23 has collaborated with many ICANN registrars & registries to bring in the Web2 domainers to the evolving webspace of Web3
98+ - Web23 is working to transform any Web2 domain to a Web3 domain
99+
100+# Specific Deliverables
101+
102+ - Web23 domain centric wallet
103+ - DID resolver as NPM based library
104+ - Integrated DID resolver within the Web23 wallet as well as the application layer for the ships
105+ - A decentralized web application with integrations of Metamask, Phantom & Blade to allow buying, mapping of Urbit IDs to Web2 domains
106+
content/grants/2023/pastebin.md → content/grants/2023/pastebin-RFP.mdrenamed+5−1
@@ -14,11 +14,15 @@ reward = "TBD"
1414assignee = [""]
1515champion = [""]
1616grant_id = "P1000"
17−completed = false
17+completed = true
1818canceled = false
1919
2020+++
2121
22+# Description
2223Tools like pastebin and Github gists allow users to easily share plain text snippets. This is useful for sharing code or simple writeups.
2324
2425Implement minimal plaintext snippet sharing for Urbit, with support for both public (anyone with the path can read the snippet) and private (only invited individuals can read snippets).
26+
27+# Link to Proposal
28+[Pastebin on Urbit](https://urbit.org/grants/pastebin-proposal)
content/grants/2023/pastebin-proposal.mdnew file+33
@@ -0,0 +1,33 @@
1++++
2+
3+title = "Pastebin on Urbit"
4+date = "2023-06-05"
5+
6+[taxonomies]
7+grant_type = ["Proposal"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = ""
13+reward = "1 Star"
14+assignee = ["~polwex"]
15+champion = ["~poldec-tonteg"]
16+grant_id = "P0271"
17+completed = false
18+canceled = false
19+
20++++
21+
22+# Description #
23+
24+One of the promises of Urbit, perhaps the biggest one, is making the Internet peer-to-peer again. That's what it's designed to do. If I want to share data with other people I should be able to share it directly. I should not need to use other people's computers (the "cloud") to share a file, or a text snippet.
25+
26+While Dropbox-like functionality will take some time to arrive to Urbit, one thing we can do right now is more simple data sharing. Pastebin is a very useful website, but again it boggles the mind that you need to use an external service to share a simple piece of text with your friends. It should be easier. We will make it so.
27+
28+This proposal will create an Urbit application to share arbitrary text. You will be able to produce a link that will display a piece of text that you saved. You will be able to expose that document to the clearweb, only inside Urbit, or to selected Urbit ships of your choice.
29+
30+# Compensation #
31+Reward: 1 star
32+#
33+Note: This proposal was modified from the [Pastebin on Urbit RFP](https://urbit.org/grants/pastebin-RFP).
content/grants/2023/replit.mdnew file+52
@@ -0,0 +1,52 @@
1++++
2+
3+title = "Replit & Replit Integration for Site"
4+date = "2023-06-21"
5+
6+[taxonomies]
7+grant_type = ["Bounty"]
8+grant_category = ["Other"]
9+
10+[extra]
11+image = ""
12+description = "Produce a Replit-compatible binary and instance."
13+reward = "4 stars"
14+assignee = [""]
15+champion = ["~mastyr-bottec"]
16+grant_id = "B0282"
17+completed = false
18+canceled = false
19+work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0282&prefill_Grant+Name=Replit%20%26%20Replit%20Integration%20for%20Site"
20+
21++++
22+
23+# Replit & Replit Integration for Urbit Developer Site
24+
25+A Replit instance lets you specify the running status of a ship and associated files. In practice, this means a fakezod which is automatically logged in, has `%base` `|mount`ed, and has `|autocommit` set for ease of use. The instance should connect to the file in some cases, the Dojo terminal in others.
26+
27+We anticipate that the biggest part of this bounty will focus not on designing the Replit environment but instead on building a Prybar binary for full REPL compatibility.
28+
29+By forking from your base instance, you should be able to prepare a base instance which meets the above basic setup criteria. Then from that, build forks which automatically inject the correct code when a generator or other specified expression has been supplied to the student.
30+
31+## Milestones
32+
33+### Milestone 1 (3 stars)
34+
35+Build a working Replit-compatible binary and base instance. This Replit instance should be [Prybar](https://github.com/replit/prybar)-compatible so that the Replit console can directly run the Dojo instance. (That is, no `screen` or `tmux` screen management is necessary for the user.)
36+
37+This may require using `%khan` and other affordances to interact with Dojo or a primary agent.
38+
39+The final deliverable should include the Prybar binary, a base Replit instance, and a Docker image suitable for use with Replit.
40+
41+### Milestone 2 (1 star)
42+
43+The Hoon School docs will benefit from direct integration of executable code blocks. To claim this bounty, you will need to prepare and include customized Replit instances at every appropriate explanation, exercise, and challenge in [the Hoon School docs](https://developers.urbit.org/guides/core/hoon-school). (This does not mean everywhere there are code blocks now; you will work with your grant champion to identify all of these.)
44+
45+(This can be split into a separate bounty based on temperament of the grantee completing Milestone 1.)
46+
47+## Resources
48+
49+- https://docs.replit.com/programming-ide/configuring-repl
50+- https://github.com/replit/prybar
51+- https://replit.com/@matthew-levan/Urbit-1#README.md
52+- https://docs.replit.com/hosting/embedding-repls
content/grants/2023/school-support-23q1.md+1−1
@@ -14,7 +14,7 @@ reward = "2 stars"
1414assignee = ["~tamlut-modnys"]
1515champion = ["~lagrev-nocfep"]
1616grant_id = "B0225"
17−completed = false
17+completed = true
1818canceled = false
1919link = ""
2020
content/grants/2023/splitwise-rfp.mdnew file+26
@@ -0,0 +1,26 @@
1++++
2+
3+title = "Expense Sharing App for Urbit"
4+date = "2023-04-03"
5+
6+[taxonomies]
7+grant_type = ["RFP"]
8+grant_category = ["App Dev"]
9+
10+[extra]
11+image = ""
12+description = "Create a crypto and fiat expense sharing app for Urbit "
13+reward = "1 Star"
14+assignee = ["~talfus-laddus"]
15+champion = [""]
16+grant_id = "P0279"
17+completed = true
18+canceled = false
19+
20++++
21+
22+The Urbit community hosts many IRL events and, inevitably, this means splitting tabs with other Urbiters. Urbit needs its own expense sharing app that seamlessly keeps track of all expenses and IOUs in one place and works with both crypto and fiat.
23+
24+The Urbit version can be loosely modeled on the expense sharing app [Splitwise](https://www.splitwise.com). Splitwise uses centralized cloud infrastructure, but an Urbit version could be architected so that accounts payable and receivable are kept on your ship. The Urbit version should also be mobile-first, so it's easy to use on the go.
25+
26+See the full proposal [here](https://urbit.org/grants/splitwise)
content/grants/2023/splitwise.md+113−9
@@ -1,25 +1,129 @@
11+++
22
3−title = "Expense Sharing App for Urbit"
4−date = "2023-04-03"
3+title = "Expense Sharing App"
4+date = "2023-06-22"
55
66[taxonomies]
7−grant_type = ["RFP"]
7+grant_type = ["Proposal"]
88grant_category = ["App Dev"]
99
1010[extra]
1111image = ""
12−description = "Create a crypto and fiat expense sharing app for Urbit "
13−reward = "TBD"
14−assignee = [""]
12+description = ""
13+reward = "1 Star"
14+assignee = ["~talfus-laddus"]
1515champion = [""]
16−grant_id = "P1001"
16+grant_id = "P0279"
1717completed = false
1818canceled = false
1919
2020+++
2121
22−The Urbit community hosts many IRL events and, inevitably, this means splitting tabs with other Urbiters. Urbit needs its own expense sharing app that seamlessly keeps track of all expenses and IOUs in one place and works with both crypto and fiat.
22+# Motivation
23+The Urbit community hosts many IRL events and, inevitably, this means splitting tabs with other Urbiters. Urbit needs its own expense sharing app that seamlessly keeps track of all expenses and IOUs in one place and works with both crypto and fiat [RFP](https://urbit.org/grants/splitwise-rfp).
2324
24−The Urbit version can be loosely modeled on the expense sharing app [Splitwise](https://www.splitwise.com). Splitwise uses centralized cloud infrastructure, but an Urbit version could be architected so that accounts payable and receivable are kept on your ship. The Urbit version should also be mobile-first, so it's easy to use on the go.
25+Urbit is for small communities. And those need a way to keep track of and to split shared expenses.
26+
27+# Basic User Story
28+A member of a group wants to keep track of all expenses in order to eventually settle debts with a minimal number of transactions.
29+
30+# Basic User Tasks
31+ - Create or select a group
32+ - Invite other people to the group
33+ - Add an expense involving other group members
34+ - View all expenses
35+ - Edit an expense
36+ - Delete an expense
37+ - Retrieve a suggestion on how to balance debts with minimal number of transactions
38+
39+# Basic User Flow
40+1. Select a group
41+2. Add an expense
42+3. Check balance
43+ - Who is owed, and who owes money to the group and how much?
44+4. Settle debts
45+ - The app suggests an efficient way to settle debts in the group
46+ - Mark outstanding expenses as paid
47+
48+# Architecture
49+The architecture will be loosely modeled on existing expense sharing apps such as [Splitwise](https://www.splitwise.com/) and [Tricount](https://www.tricount.com/en/).
50+
51+An expense can involve only a subset of all group members. It has the following attributes:
52+
53+- title (For what reasons?)
54+ - payer (Who paid?)
55+ - involves (For whom?)
56+ - date (When?)
57+ - amount (How much?)
58+ - currency
59+ - note
60+
61+All group members are ships (`@p`). A list of group members and all expenses of the group will be stored on the ship of the group initiator. Other group members will read and write from/to there.
62+
63+In order to find a minimum number of transaction to settle debts in the group ("simplified debts"), shared expenses will be modeled as a flow network. Money flows from the participants who owe money to the group (debitors) to the participants who are owed money by the group (creditors). Using [Edmonds–Karp algorithm](https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm), the [maximum flow](https://en.wikipedia.org/wiki/Maximum_flow_problem) of this network will be computed. From the resulting residual network transactions to balance out shared expenses will be derived. A Python reference implementation can already be found [here](https://git.sr.ht/~talfus-laddus/splt-exps-py).
64+
65+*Note: The trivial case of settling debts among two person (group size of two) is of course supported.*
66+
67+# Backend
68+The backend will be a gall agent with a basic set of operations addressing the user's needs listed above. Alongside the gall agent, a couple of libraries will be created: A library implementing the Edmonds-Karp algorithm and a library handling currency exchange rates and conversions.
69+
70+# Frontend
71+[Keep it simple, stupid!](https://en.wikipedia.org/wiki/KISS_principle)
72+The frontend will be a mobile-first website.
73+
74+It is an open question whether the frontend will in the initial phase be served from Mars or Earth. The website should eventually be served from the ship.
75+
76+# Milestones
77+Documentation and tests throughout the code base will be present. The source code will be available in a public git repository and licensed under MIT.
78+
79+## Milestone 1 - Proof of Concept
80+Completion: Beginning of App School Live (August 2023)
81+
82+Payment: None
83+
84+Deliverables: Edmonds-Karp Library
85+
86+The Proof of Concept (POC) demonstrates how to model shared expenses as a flow network and how to derive from it the minimum number of transactions needed to settle debts. The POC implements the Edmonds-Karp algorithm as well as the logic of how to construct the flow network from a list of expenses and how to derive a list of transactions from the residual network.
87+
88+## Milestone 2 - Minimal Viable Product
89+Completion: End of App School Live before Assembly (October 2023)
90+
91+Payment: 1 Star
92+
93+Deliverables : Gall Agent: Website
94+
95+The Minimal Viable Product (MVP) consists of a gall agent as backend and a website as frontend.
96+
97+Iterations
98+1. Create a gall agent containing a basic set of operations to manage groups and to add, store, delete and retrieve group expenses.
99+2. Create a simple, stupid and mobile-first website as an interface to the gall agent.
100+3. Add a feature to “simplify debts” by integrating the Edmonds-Karp library into the gall agent. The agent can suggest a way to balance out shared expenses with a minimal number of transactions.
101+4. Synchronize expenses among the group members.
102+5. Handle different currencies. Retrieve the current exchange rate and do conversions between currencies.
103+6. Make the app available through Software Distribution.
104+
105+# Limitations
106+Since the list of expenses is stored on the group initiator's ship, when it is down other people can not synchronize their state of the application.
107+
108+# Additional Future Work
109+The future of the app could entail:
110+
111+ - A robust decentralization/synchronization mechanism which addresses the limitation raised above
112+ - A more polished interface
113+ - An integration into Groups
114+ - Apps for Android and iOS
115+ - A new feature to categorize expenses and derive statistics
116+ - Yet unforeseen improvements
117+
118+# About Me
119+I am in search of something worthwhile to contribute my time and effort to.
120+
121+My name is Matthias Schaub (`~talfus-laddus`). Even though I work part-time as a software developer for a non-profit corporation dedicated to better society and environment, I feel the need to spend my time on projects of which I am more confident that they provide sustained value to society (or at least have the potential to). That is why I am invested to contribute to the Urbit ecosystem by learning Hoon and how to build applications on Urbit. A more basic motivation is to have my flat mates on Urbit. Beside a chat, we need a way to handle shared expenses.
122+
123+I attended Hoon School and registered for App School. Alongside the App School curriculum, I want to foster my learning by building this application. On Earth side I have solid Python and basic HTML, CSS, and JavaScript skills. I am proficient in git, and I am used to working with a terminal on a Linux machine. In the past, I wanted to read the reference of a Hoon rune without leaving Vim. So I wrote a Python script to convert Hoon rune references from Markdown to Vimdoc. The result is a Vim helpfile in disguise of a plugin ([hoon-runes.vim](https://git.sr.ht/~talfus-laddus/hoon-runes.vim)). Shortly after, I did the same for the documentation of the Hoon standard library ([hoon-stdlib.vim](https://git.sr.ht/~talfus-laddus/hoon-stdlib.vim)).
124+
125+In order to find out more about my previous works:
126+ - [Personal website](https://talfus-laddus.de/)
127+ - [Sourcehut](https://git.sr.ht/~talfus-laddus)
128+ - [GitHub](https://github.com/matthiasschaub)
25129
content/grants/2023/uc-concierge.md+3−3
@@ -11,12 +11,11 @@ grant_category = ["Other"]
1111image = ""
1212description = "The Urbit Community concierge will triage Urbit support issues that come in through the Urbit Community Group."
1313reward = "1 Star"
14−assignee = [""]
15−champion = [""]
14+assignee = ["~sarlev-sarsen", "~ripnyt-ripnyt", "~doppeg-tonwel"]
15+champion = ["~poldec-tonteg"]
1616grant_id = "B0232"
1717completed = false
1818canceled = false
19−work_request_link = "https://airtable.com/shr4qt9t9kz7RaOIa?prefill_Grant+ID=B0232&prefill_Grant+Name=Urbit%20Community%20Support%20Concierge"
2019
2120+++
2221
@@ -36,6 +35,7 @@ The Urbit Community concierge will triage Urbit support issues that come in thro
3635- Familiarity with running urbit in a variety of environments (cloud server, laptop)
3736- Ability/interest in synthesizing support data and recommending new features or documentation
3837- Dilligence
38+- **Considering applications from contributors in Asia time zones UTC (GMT) +4 to UTC (GMT) +10 only.**
3939
4040## Compensation and Timeline
4141
vercel.json+6−1
@@ -5,7 +5,12 @@
55 "redirects": [
66 {
77 "source": "/sponsordeck",
8− "destination": "https://docs.google.com/presentation/d/1G4O0ya8rzpZukG9XxwBgpkWyTbXZjqCzA8IwctrcmX4",
8+ "destination": "https://tinyurl.com/urbitsponsordeck",
9+ "permanent": true
10+ },
11+ {
12+ "source": "/uf-public",
13+ "destination": "https://tlon.network/lure/~halbex-palheb/uf-public",
914 "permanent": false
1015 },
1116 {