+++ title = "Filesystem" template = "doc.html" weight = 3 +++ Urbit has its own revision-controlled filesystem, Clay. Clay is a typed, global, referentially transparent namespace. An easy way to think about it is like typed `git`. The most common way to use Clay is to mount a Clay node in a Unix directory. The mounted directory is always at the root of your pier directory. ### Quickstart This quick-start guide will walk you through some common commands. Follow along using your Dojo. When you get a `>=` message after entering a command, this means that the command was successful. It's important to note that whenever you want to sync changes from your Unix directory to your ship, you must use the `|commit %desk` command, where `%desk` is the desk that you'd like to sync to. When developing it's a good idea to use a separate desk. Create a `%sandbox` desk based on the `%home` desk: ``` ~your-urbit:dojo> |merge %sandbox ~your-urbit %home ``` Running `our` produces your ship-name, meaning that you can run the following command instead of typing out the entire thing. Useful for comets due to their very long names. ``` ~your-urbit:dojo> |merge %sandbox our %home ``` Most of the time we want to use Clay from Unix. Mount the entire contents of your `sandbox` desk to Unix: ``` ~your-urbit:dojo> |mount /=sandbox= ``` To explore the filesystem from inside Urbit `+ls` and `+cat` are useful. `+ls` displays files in the current directory, and `+cat` displays the contents of a file. We can use `%` to mean "current directory." The result of the command below is just like using `ls` in a Unix terminal. ``` ~your-urbit:dojo> +ls % ``` Notice how `+cat %` does the same thing. That's because everything in Clay, including directories, is a file. Sync from your friend `~some-ship`'s `%experiment` desk to your `%sandbox` desk: ``` ~your-urbit:dojo> |sync %sandbox ~some-ship %experiment ``` If and when your sync is successful, you will receive a message: ``` activated sync from %experiment on ~some-ship to %sandbox ``` The ship that you sync from will get their own message indicating that you're both connected as peers: ``` ; ~your-urbit is your neighbor. ``` --- ### Clay manual #### Paths A path in Clay is a list of URL-safe text, restricted to the characters `[a z]`,`[0 9]`, `.`, `-`, `_`, and `~`. Formally this is a `(list knot)`, meaning that each segment, delineated by `/`, is of the `knot` ASCII-text type. In other words, paths are expressed as `/foo/bar/baz`. File extensions are separated from file names with `/`, not `.`. Extensions are syntactically identical to subdirectories, except that they must terminate the path. Paths begin with a piece of data called a `beak`. A beak is formally a `(p=ship q=desk r=case)`; it has three components, and might look like `/~dozbud-namsep/home/11`. The first `beak` component is `ship`, which is, as you might guess, the name of an Urbit ship. The second component is `desk`, which is a workspace meant to contain other directories; the default desk is `%home`. The third component is `case`, which represents version information in various ways: date and time; a version sequence, which is a value incremented by one whenever a file on the given `desk` is modified; or an arbitrary plaintext label. You can find what your `beak` is at any given moment by typing `%` in the Dojo and looking at the first three results. We use `beak`s because, unlike the current internet, the Urbit network uses a global namespace. That means that a file named `example.hoon` in the `/gen` directory on the `%home` desk of your ship `~lodleb-ritrul` would have a universal address to anyone else on the network: `/~lodleb-ritrul/home/186/gen/example/hoon`. That, of course, doesn't mean that everyone on the network has privileges to access that path. The structure that combines a `beak` with further path information is called a `beam`. #### Relative paths The `%` command, which we gestured at in the above section, represents the **relative path**, which is the path where you are currently working. If your working directory is just your home desk, indicated by the prompt `~your-planet:dojo>`, then running the command below will print your working directory's `beam` information: your `beak`, and a `~` that represents the empty list since no path is present. ``` ~your-urbit:dojo> % ``` `%`s can be stacked to indicate one level further up in the hierarchy for each additional `%`. Try the following command: ``` ~your-planet:dojo> %%% ``` You'll probably notice that it only has your ship name and the empty list. The two additional `%`s abandoned the `case` and the `desk` information by moving up twice the hierarchy. There are no local relative paths. `/foo/bar` must be written as `%/foo/bar`. #### Substitution You don't need to write out the explicit path every time you want to reference somewhere outside of your working directory. You can substitute `=` for the segments of a path. Recall that a full address in the the Urbit namespace is a `beam`: the `/ship/desk/case/path`. If you've switched to another desk before, you're already familiar with substitution syntax: ``` ~your-urbit:dojo> =dir /=sandbox= ``` The above command uses substitution to use your current `ship` and `case`; only the `desk` argument, which is located between the other two, is given something new. Without substitution, you would need to write: ``` ~your-urbit:dojo> =dir /~your-urbit/sandbox/85 ``` Substitutions work the same way in `beak`s (the `ship/desk/case` part) and paths. For example, if you are in the `/gen` directory, you can reference a file in the `/app` directory like below. (`+cat` displays the contents of a file). ``` ~your-urbit:dojo> =dir %/gen ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> +cat /===/app/curl/hoon ``` Note what was substituted out, and note that we don't need to separate `=` with `/`. If we changed our working directory to something called `/gen/gmail`, we could access a file called ``` ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> =dir %/gmail ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/gmail> +cat /===/app/=/split/hoon ``` Because both paths share a directory named `/gmail` at the same position in the address hierarchy – which, if you recall, is just a `list` – the above command works! We can do the same thing between desks. If `%sandbox` has been merged with `%home`, the following command will produce the same results as the above command. ``` ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/gmail> +cat /=sandbox=/app/=/split/hoon ``` Most commonly this is used to avoid having to know the current revision number in the `dojo`: `/~lodleb-ritrul/home/~2018.10.2..00.35.44..d7e8/gen/example/hoon` #### Changing directories Change the working directory with `=dir`. It's our equivalent of the Unix `cd`. For example, the syntax to navigate to `/home/gen/ask` is: ``` ~your-urbit:dojo> =dir /=home=/gen/ask ``` This command will turn your prompt into something like this: ``` ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/ask> ``` Using `=dir` without anything else uses the null path, which returns you to your home desk. ``` ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen/ask> =dir ``` Your dojo prompt will turn back into `~your-urbit:dojo>`. To go up levels in the path hierarchy, recall the relative path expression `%`. Stacking them represents another level higher in the hierarchy than the current working directory for each `%` beyond the initial. The command below brings you one level up: ``` ~your-urbit:dojo> =dir %/gen ~your-urbit:dojo/=/=/~2018.10.2..00.35.44..d7e8/gen> =dir %% ``` ### Revision-control #### Mount Syntax: `|mount /clay/path [Unix-name]` Mount the `clay-path` at the Unix mount point `Unix-name`. **Examples:** ``` |mount %/gen generators ``` Mounts `%/gen` to `/generators` inside your pier directory. #### Unmount ``` |unmount [clay-path || Unix-name] ``` Unmount the path or name from Unix. **Examples:** ``` |unmount %/gen ``` Unmounts the Clay path `%/gen` from whatever name it was mounted as. ``` |unmount %generators ``` Unmounts the Unix path `/generators`. #### Merge ``` |merge desk beak[, =gem strategy] ``` Merges a `beak` into a `desk` using an optional merge `strategy`. A `beak` is a ship-desk-case triple, encoded as a path(`/~dozbud/home/2`) **Examples:** ``` |merge %home-work /=home=, =gem %fine ``` Merge `/=home=` into `%home-work` using merge strategy `%fine`. ``` |merge %examples ~wacbex-ribmex %examples ``` Merge the `%examples` desk from `~waxbex-ribmex` #### Sync ``` |sync desk plot [plot-desk] ``` Subscribe to continuous updates from remote `plot` on local `desk`. `plot-desk` can specify the remote `desk` name. When omitted it defaults to being the same as `desk`. Non-comet urbits have `|sync %home ~parent %kids` automatically set up (where `~parent` is the planet that issued a moon, the star that issued a planet, or the galaxy that issued a star). **Examples:** ``` |sync %home-local ~dozbud %home |sync %home ~doznec ``` #### Unsync ``` |unsync desk plot [plot-desk] ``` Unsubscribe from updates from remote `plot` on local `desk` with optional `plot-desk`. Arguments must match original `|sync` command. Example: ``` |unsync %home-local ~dozbud %home ``` #### Label ``` |label desk name ``` Label the current version of `desk` `name`. Example: ``` |label %home release ``` ### Merge strategies See [Clay merge strategies](@/docs/arvo/clay/clay.md#merge-strategies). ### Manipulation #### `+cat` Syntax: `+cat path [path ...]` Similar to Unix `cat`. `+cat` takes one or more `path`s, and prints their contents. If that `path` is a file, the contents of the file is printed. If the `path` terminates in a directory, the list of names at that path is produced. #### `+ls` Syntax: `+ls path` Similar to Unix `ls`. `+ls` takes a single `path`. Produces a list of names at the `path`. ``` ~your-urbit:dojo> +cat %/our/home/gen/curl/hoon ``` #### `|rm` Syntax: `|rm path` Remove the data at `path`. `Path` must be a path to the actual node, not a 'directory'. #### `|cp` Syntax: `|cp to from` Copy the file at `from` into the path `to`. #### `|mv` Syntax: `|mv to from` Move the file at `from` into the path `to`. In Clay, `|mv` is just a shorthand for `|cp` then `|rm`. The `|rm` doesn't happen unless the `|cp` succeeds.