Reading the repo
Opening the box…
Reading the repo
Opening the box…
How to install on macOS
Project NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.
GitHub didn't answer, so this is the saved copy from 16 h ago
Will it work on macOS?
While many similar offline survival computers are designed to be run on bare-minimum, lightweight hardware, Project NOMAD is quite the opposite. To install and run the available AI tools, we highly encourage the use of a beefy, GPU-backed device to make the most of your install.
At its core, however, NOMAD is still very lightweight. For a barebones installation of the management application itself, the following minimal specs are required:
Note: Project NOMAD is not sponsored by any hardware manufacturer and is designed to be as hardware-agnostic as possible. The hardware listed below is for example/comparison use only
Adding the AI Assistant brings the install to roughly 25 GB, because Ollama and a general-purpose model are both large, and a model needs about its download size in memory while it answers. That memory comes from VRAM if you have a discrete GPU and from system RAM if you do not, which is the single biggest reason the figures below are so much higher.
To run LLMs and other included AI tools:
For detailed build recommendations at three price points ($150–$1,000+), see the Hardware Guide.
Again, Project NOMAD itself is quite lightweight — it's the tools and resources you choose to install with NOMAD that will determine the specs required for your unique deployment
By default, NOMAD's installer will attempt to setup Ollama on the host when the AI Assistant is installed. However, if you would like to run the AI model on a different host, you can go to the settings of the AI assistant and input a URL for either an ollama or OpenAI-compatible API server (such as LM Studio).
Note that if you use Ollama on a different host, you must start the server with this option: OLLAMA_HOST=0.0.0.0.
Ollama is the preferred way to use the AI assistant, as it has features such as model download that OpenAI API does not support. So when using LM Studio, for example, you will have to use LM Studio to download models.
You are responsible for the setup of Ollama/OpenAI server on the other host.
Heads-upBuilding it yourself? It also needs 15 settings in .env.
CONTRIBUTING.mdThank you for your interest in contributing to Project NOMAD! Community contributions are what keep this project growing and improving. Please read this guide fully before getting started — it will save you (and the maintainers) a lot of time.
Note: Acceptance of contributions is not guaranteed. All pull requests are evaluated based on quality, relevance, and alignment with the project's goals. The maintainers of Project NOMAD ("NOMAD") reserve the right to accept, deny, or modify any pull request at their sole discretion.
Please read and review our full Code of Conduct before contributing. In short: please be respectful and considerate in all interactions with maintainers and other contributors.
We are committed to providing a welcoming environment for everyone. Disrespectful or abusive behavior will not be tolerated.
Open an issue first. Before writing any code for a non-trivial change, you must open an issue to discuss your proposed change. This helps avoid duplicate work and ensures your contribution aligns with the project's direction. Pull requests submitted without a corresponding issue may be closed at the maintainers' discretion.
Trivial fixes are exempt and may be submitted directly as a PR. Examples:
If you're not sure whether your change qualifies as trivial, open an issue first.
When opening an issue:
Please note: this is the Getting Started guide for developing and contributing to NOMAD, NOT installing NOMAD for regular use!
sudo/root privilegesgit clone https://github.com/YOUR_USERNAME/project-nomad.git
cd project-nomad
git remote add upstream https://github.com/Crosstalk-Solutions/project-nomad.git
Because NOMAD relies heavily on Docker, we actually recommend against installing a release version of the project on the same local machine where you are developing. This can lead to conflicts with ports, volumes, and other resources. Instead, you can run your development version in a separate Docker environment while keeping your local machine clean. It certainly can be done, but it adds complexity to your setup and workflow. If you choose to install a release version locally, please ensure you have a clear strategy for managing potential conflicts and resource usage.
Sync with upstream before starting any new work. We prefer rebasing over merge commits to keep a clean, linear git history as much as possible (this also makes it easier for maintainers to review and merge your changes). To sync with upstream:
git fetch upstream
git checkout dev
git rebase upstream/dev
Create a feature branch off dev with a descriptive name:
git checkout -b fix/issue-123
# or
git checkout -b feature/add-new-tool
Make your changes. Follow existing code style and conventions. Test your changes locally against a running NOMAD instance before submitting.
If you touched the AI Assistant or RAG, measure it. Anything affecting
chunking, embedding, retrieval, reranking, thresholds, the system prompts, or
context assembly should be backed by numbers rather than a spot check —
"it seemed better in the chat window" is how a regression ships. From admin/:
node ace eval:corpus --ingest # once; safe, never touches your real knowledge base
node ace eval:retrieval --ablate # seconds, deterministic, no chat model
node ace eval:generation --model=<your model> --all-modes
Include the before/after numbers in your pull request. See
admin/tests/eval/README.md for what the
metrics mean, how the three generation modes separate a code bug from a model
that is simply too small, and the harness's known limitations.
Commit your changes using Conventional Commits.
Push your branch and open a pull request.
NOMAD's guiding principle is that user-friendliness is paramount: a control that looks or behaves differently from the rest of the app reads as broken to a non-technical user. New frontend (inertia/React) work should be visually and behaviorally uniform with what is already there. Before adding a UI element, look at its neighbors and reuse the shared building blocks rather than hand-rolling a one-off.
Reuse the shared components in admin/inertia/components/ (and .../components/inputs/):
| Need | Use | Not |
|------|-----|-----|
| Binary on/off setting | Switch | a raw <input type="checkbox"> |
| Explanatory hover help | InfoTooltip | a raw title= attribute or a bespoke tooltip |
| Modal / confirmation dialog | StyledModal | a hand-built overlay |
| Text field | Input | a bare <input> |
| Section heading | StyledSectionHeader | ad-hoc heading markup |
Grep for an existing component before building a new one.
Match the neighbors. Copy the exact classes and conventions of adjacent elements:
Model: (with a colon), yours should read Thinking:, not Thinking. Reuse the same typography tokens (e.g. text-sm text-text-secondary).text-*, bg-*, border-*) so the element works in light and dark mode. Never hardcode colors.When a raw control is fine. These conventions are about matching intent, not banning primitives. A raw checkbox is appropriate for a multi-select list or a consent box; radio groups and native selects are fine where a shared component does not exist. The point is to reach for the shared component when your case matches its intent (a binary setting toggle should be a Switch), not to eliminate primitives.
Test UI changes in a real browser. Most of these conventions are judgment calls that tooling cannot fully enforce, so the single most important habit is to load your change in a browser against a running instance before submitting. Several classes of issue (clipped or cramped tooltips, layout breaking at different window widths, blank-screen render errors) are invisible to type-checking and only show up when you actually look at the page. Check the states that should appear and the states that should be hidden, and try more than one window width when layout or positioning is involved.
This project uses Conventional Commits. All commit messages must follow this format:
<type>(<scope>): <description>
Common types:
| Type | When to use |
|------|-------------|
| feat | A new user-facing feature |
| fix | A bug fix |
| docs | Documentation changes only |
| refactor | Code change that isn't a fix or feature and does not affect functionality |
| chore | Build process, dependency updates, tooling |
| test | Adding or updating tests |
Scope is optional but encouraged — use it to indicate the area of the codebase affected (e.g., api, ui, maps).
Examples:
feat(ui): add dark mode toggle to Command Center
fix(api): resolve container status not updating after restart
docs: update hardware requirements in README
chore(deps): bump docker-compose to v2.24
Human-readable release notes live in admin/docs/release-notes.md and are displayed directly in the Command Center UI.
If your PR is merged in, the maintainers will update the release notes with a summary of your contribution and credit you as the author. You do not need to add this yourself in the PR (please don't, as it may cause merge conflicts), but you can include a suggested note in the PR description if you like.
This project uses Semantic Versioning. Versions are managed in the root package.json and updated automatically by semantic-release. The project-nomad Docker image uses this version. The admin/package.json version stays at 0.0.0 and should not be changed manually.
git push origin your-branch-name
dev branch of this repositoryCloses #123) — required for non-trivial changesHave questions or want to discuss ideas before opening an issue? Join the community:
Project NOMAD is licensed under the Apache License 2.0.
Then run bash setup.sh. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Compare yours with the README's “Device Requirements” list above before installing anything.
Needs Git: xcode-select --install
git clone https://github.com/Crosstalk-Solutions/project-nomad.git cd project-nomad
Node.js 24
# needs nvm: brew install nvm (or https://github.com/nvm-sh/nvm) nvm install 24
npm ci
Project NOMAD can be installed on any Debian-based operating system (we recommend Ubuntu 26.04 LTS; 24.04 LTS and Debian 12 are also supported). Installation is completely terminal-based, and all tools and resources are designed to be accessed through the browser, so there's no need for a desktop environment if you'd rather setup NOMAD as a "server" and access it through other clients.
Before you start: NOMAD itself needs about 5 GB of disk and under 1 GB of RAM. The offline content you add afterwards is what actually fills a drive, and the AI Assistant is what drives the memory requirement up. See Device Requirements for both, and the FAQ for individual content sizes.
Note: sudo/root privileges are required to run the install script
sudo apt-get update && \
sudo apt-get install -y curl && \
curl -fsSL https://raw.githubusercontent.com/Crosstalk-Solutions/project-nomad/refs/heads/main/install/install_nomad.sh \
-o install_nomad.sh && \
sudo bash install_nomad.sh
Project NOMAD is now installed on your device! Open a browser and navigate to http://localhost:8080 (or http://DEVICE_IP:8080) to start exploring!
For a complete step-by-step walkthrough (including Ubuntu installation), see the Installation Guide. For Windows users, see the WSL2 install guide — community-supported path covering native Docker and Docker Desktop install routes.
For more control over the installation process, copy and paste the Docker Compose template into a docker-compose.yml file and customize it to your liking (be sure to replace any placeholders with your actual values). Then, run docker compose up -d to start the Command Center and its dependencies. Note: this method is recommended for advanced users only, as it requires familiarity with Docker and manual configuration before starting.
No reports for macOS yet.
GitManual AI Agent reads the 11 key files and writes a step-by-step guide for macOS. Once written, it's saved for everyone.