on master help sign in
14 files changed+459−16
since splitsnapshots
unifiedsplit
content/blog/aesthetic-culture-1.md+1−1 content/blog/ares.md+51 content/events/2023-06-24-urbit-meetup-christchurch.md+24 content/events/2023-06-29-Urbit-Paris-Meetup-1.md+1−1 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/elm.md+4−1 content/grants/2023/json-parser-suite.md+1−1 content/grants/2023/mapping-ids.md+106 content/grants/2023/replit.md+52 content/grants/2023/splitwise-rfp.md+26 content/grants/2023/splitwise.md+113−9 content/grants/2023/uc-concierge.md+2−3
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/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.md+1−1
@@ -3,7 +3,7 @@ title = "Urbit Meetup in Paris"
33starts = "2023-06-29T18:30:00"
44ends = "2023-06-29T21:30:00"
55timezone = "Europe/Amsterdam"
6−location = "Paris (TBA)"
6+location = "La Fièvre, 108 Rue Oberkampf, 75011 Paris"
77image = "https://storage.googleapis.com/media.urbit.org/site/events/urbitParis-meetup-1.png"
88registration_url = "https://www.meetup.com/urbit-paris/events/293962806/"
99description = "Urbit Paris - Meetup #1"
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/elm.md+4−1
@@ -10,7 +10,7 @@ grant_category = ["Other"]
1010[extra]
1111image = ""
1212description = "Making Elm the frontend technology for Urbit"
13−reward = "5 Stars"
13+reward = "5 Stars + Bonus"
1414assignee = ["~racfer-hattes"]
1515champion = ["~rovnys-ricfer"]
1616grant_id = "P0275"
@@ -62,4 +62,7 @@ Reward: 1 star
6262
6363Deliverables: An Elm airlock library that supports Solid-state subscriptions.
6464
65+## Bonus
66+
67+Upon successful completion of project, the contributor will also receive a 6K USDC bonus funded by Vaporware
6568
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/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/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+2−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