Nomia is inspired by tools such as Nix, Unison, and Git. They all provide distinct, immutable names for resources like packages, code, and files. Nomia wants to bring them together (and more!) to make reproducing whole environments—from your editor to code to data to complete running services—as easy as git switch
.
Nomia’s a growing project and we want you to help shape it. Join us on our Discord server or attend a pairing session.
Nomia provides a systematic mechanism for giving names to any kind of resource, composing those names together to identify new composite resources, and acquiring access to the resources thus identified. These capabilities allow for precise, efficient resource management, all using a single unified abstraction applicable across domains. Nomia solves the problem of cache invalidation by solving the problem of naming things, and that’s just for starters!
There are other systems that provide similar capabilities. Nix provides mechanisms to identify packages by their exact build steps and the inputs they rely on, enabling fully reproducible package management with efficient sharing of common dependencies between builds and systems. Unison provides mechanisms to identify immutable pieces of code by content, allowing precise code dependency management, distributed computation, and a transparent automatic compilation model. Git provides mechanisms to identify files, filesystem trees, and source control artifacts like commits and tags by their content, enabling distributed source control with efficient sharing and transmission of changes. Inspired by these and similar systems, Nomia starts with these notions of identifying, combining, distributing, and creating resources by name, and builds upon them by:
- Allowing arbitrary kinds of resources to be identified within the system and combined. Nomia can handle packages, services, pieces of code, entire data centers, individual time-slices of CPU work—any type of resource you can work with.
- Enabling domain-specific notions of the precision and semantics of names to coexist. Nomia names can capture identifications as precise as “the build of the Acme webserver from revision
b7397db
built inside a fresh docker container based onubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
” or as loose as “the latest version of the user’s favorite browser, either cross-compiled or native-compiled to target ARMv8”, and combine them together. - Having a first-class representation of relationships between names; identifying refinements of resource names; and enabling efficient reuse of existing resources, resource storage mechanisms, and resource creation mechanisms. A name which specifies “the latest version of the user’s favorite browser, either cross-compiled or native-compiled to target ARMv8” might, at a particular invocation, reduce to “firefox 87.0 cross-compiled from amd64 linux”, which we may have already built or already know how to build.
In the Nomia-powered future, you will be able to:
- Point your editor to
(client-projects:acme):server//src/main.cc
and have the latest version of the Acme server source code downloaded to your machine, themain.cc
file opened, and the dependencies loaded for use by your editor’s code checker. - Make a change and point your browser to
nomia://(client-projects:acme):server/login
and have the Acme server built (reusing the results of the latest CI build for unchanged files), the service and its dependencies started, and the login page for your local instance loaded into your browser. - Tell your deployment tool to modify the staging environment with the replacement
acme-server => (client-projects:acme):server
and have the local(client-projects:acme):server
automatically reduced to the more deterministiccmake:c++-project(input: immutable-filesystem-object?hash=9368819aaf6f619ec109e544b56ca05a21375ca671d00dbf7532e0b69aded39a)
and the results shipped off to your staging environment with all downstream dependencies pointing to your changed service.
Behind the scenes of each step, Nomia will be driving name resolution and resource acquisition.
Nomia is in early active development, and we are fleshing out the documentation as we go. For now, the following resources are available:
- The Deep Dive Into Nomia paper expands on the motivation for and the conceptual model underlying Nomia in detail.
- The Nomia name representation is specified in the formal grammar.
- The roadmap shows one possible near-term implementation plan.
- This thread on the NixOS discourse goes into some more detail about how Nomia relates to Nix.
- This blog post announces Nomia, and relates it to Scarf’s mission and related work.
- The Scarf CLI is currently implemented on top of an internal prototype of basic Nomia capabilities. These will be reimplemented as standalone components (likely in Rust) and moved into this repository.
Nomia’s community currently centers around this GitHub repository and our Discord server. We hope to see you there!
We host the following events on Discord. The time for these events is easy to change based on community availability, please reach out on Discord if you’d like to come!:
- Scheduled pairing
- 2:00 PM - 4:00 PM UTC (10:00 AM - 12:00 PM ET), Wednesdays and Fridays
- Project update
- 5:30 PM - 6:30 PM UTC (1:30 PM - 2:30 PM ET), last Friday of the month
- Unscheduled pairing
- Ad hoc, announced in the #announcements channel on Discord.
See the calendar for more details.