digitalomanai
v2.0.5
Published
DigitalOman.ai — offline AI assistant for the terminal. Runs a local Llama 3.2 1B on your own machine, with web search, document and image analysis, mail, ERP connectivity, notes and transcription.
Maintainers
Readme
DigitalOman.ai
An offline AI assistant you install like any other npm package and start from a terminal — on Linux, macOS or Windows. It runs Llama 3.2 1B on your own machine: no account, no API key, and nothing leaving the device unless you connect a cloud provider yourself.
npm install -g digitalomanai
digitalomanaiThe command opens the app in its own window. It is not a browser tab.
Installing downloads everything the app needs — the language model and the image, speech and OCR components, about 980 MB in total — so that when the window opens, every feature in it already works. Budget a few minutes for the install. A download that fails does not fail the install: the app fetches whatever is missing when it first starts.
To install without downloading the weights (a CI image, a Docker layer, a machine you will provision later):
DIGITALOMANAI_SKIP_DOWNLOAD=1 npm install -g digitalomanaiWhat you get
| | | |---|---| | Chat | Streaming conversation with a local model, full history, per-conversation titles | | Documents | PDF, DOCX, XLSX, PPTX and 70+ text and code formats — read, summarise, ask about | | Images | On-device OCR, image recognition and object detection — and if the chosen model cannot see images, that reading is passed to it as text so the question still gets answered | | Web | Search, and an in-app reader that pulls a page's text for the model | | AI Academy | Guided learning sessions | | AI Gallery | Image search with a saved-recents shelf | | Mail | IMAP inbox and SMTP sending | | ERP | Tally and SQL Server connectivity, saved read-only queries, charts and dashboards | | Notes · To Do · Transcribe | Notes with DOCX/HTML export, tasks that feed the model context, speech-to-text | | Cloud providers | Optional — Gemini, ChatGPT, Claude, Groq, Mistral, DeepSeek, Qwen, or any custom streaming endpoint |
Everything works with no network once the model is downloaded, except the features that are inherently online (web search, mail, cloud providers).
Requirements
- Node 20 or newer
- ~2.5 GB disk — about 1.6 GB of dependencies, a 770 MB model and 172 MB of image/speech components
- 4 GB RAM to run the 1B comfortably; a GPU is used automatically when one is available and the weights fit, otherwise it runs on the CPU
No compiler and no build tools. Every native component ships as a prebuilt binary for your platform.
First run
$ digitalomanai
DigitalOman.ai v2.0.0
server http://127.0.0.1:7331
data /home/you/.config/DigitalOman.ai
window open (Electron)
Close the window or press Ctrl+C to stop.The model downloads once, into your data directory, with the progress shown on the splash screen. It resumes where it stopped if the connection drops.
Offline install. If the machine has no internet, copy the .gguf across and
point at it — nothing is downloaded:
digitalomanai model import ./Llama-3.2-1B-Instruct.Q4_K_M.gguf
# or, without copying it:
DIGITALOMANAI_MODEL=/path/to/model.gguf digitalomanaiThe name does not have to match: capitalisation, dots and dashes are ignored when the model is looked up, so a copy from any mirror is recognised rather than downloaded a second time.
These are fetched during installation too, so this is only needed if the install could not reach the network:
digitalomanai model download --ml # image, speech and OCR components
digitalomanai model download --all # those and the language modeldigitalomanai doctor shows what is already on disk.
Terminal use
The window is not the only way in. Every subcommand goes through the same code the window does, so the two can never disagree.
digitalomanai chat "explain a GGUF quantisation in two sentences"
digitalomanai ask report.pdf "what were the Q3 revenue figures?"
digitalomanai ask receipt.jpg "how much was the total?"
digitalomanai read contract.docx > contract.txt
digitalomanai search "oman logistics 2026"
digitalomanai model list
digitalomanai provider use local # or: gemini, claude, openai…
digitalomanai mail list --unread
digitalomanai erp query <id> <queryId>
digitalomanai notes list --json
digitalomanai doctor # check this machine
digitalomanai serve --port 8080 # server only, no window
digitalomanai --dev # open with devtools attachedchat and ask stream to stdout and put progress on stderr, so redirecting
gives you just the answer:
digitalomanai chat "summarise this" > answer.txtThe window
digitalomanai opens a real application window, and falls back rather than
failing if it can't:
- Electron — a dedicated window with its own icon and taskbar entry. This is installed by default as an optional dependency.
- Chrome / Edge / Brave / Vivaldi in app mode — a clean window with no tab strip or address bar, if Electron isn't available.
- Your default browser — a tab.
- The URL, printed — on a headless box or over SSH. Forward the port and open it from your own machine.
Closing the window stops the server. Killing the terminal closes the window.
To force a browser instead of Electron:
DIGITALOMANAI_NO_ELECTRON=1 digitalomanaiCloud providers
The local model is the default and needs no configuration. To use a hosted model instead, open the model picker in the app and add a key — or point at any OpenAI-compatible endpoint under Custom endpoint, where the request body comes pre-filled with a working template you can edit:
{"model":"my-model","stream":true,"messages":[{"role":"user","content":"{prompt}"}]}{prompt} is replaced with your message; {key} in the auth header is replaced
with your API key. Switch back at any time with digitalomanai provider use local.
Where your data lives
| | |
|---|---|
| Linux | ~/.config/DigitalOman.ai |
| macOS | ~/Library/Application Support/DigitalOman.ai |
| Windows | %APPDATA%\DigitalOman.ai |
Conversations, notes, tasks and models are plain files there. API keys, mail passwords and ERP credentials are encrypted with AES-256-GCM under a key file that only your user account can read.
digitalomanai where prints the path. DIGITALOMANAI_HOME overrides it.
Environment variables
| Variable | Effect |
|---|---|
| DIGITALOMANAI_HOME | Data directory |
| DIGITALOMANAI_MODEL | Use a specific .gguf instead of the default |
| DIGITALOMANAI_ML_DIR | Where OCR / vision / speech weights are cached |
| DIGITALOMANAI_BROWSER | Browser to use for the window |
| DIGITALOMANAI_NO_ELECTRON | Skip Electron, use a browser window |
| DIGITALOMANAI_SKIP_DOWNLOAD | Install without fetching the model and components |
| DIGITALOMANAI_DEBUG | Print stack traces on error |
| NO_COLOR | Disable colour |
Architecture
Three processes, deliberately:
digitalomanai (node) the app
├── HTTP server on 127.0.0.1 serves the UI, carries the RPC
├── llama worker (forked node) model weights and inference
└── window process (Electron) draws the UI, nothing elseThe split is not incidental. Electron's allocator kills large CPU-side model
loads with SIGILL, so inference never runs under Electron — the window
process only renders HTML served over HTTP and holds no credentials, no model
and no Node access (contextIsolation on, nodeIntegration off). A build check
enforces that no module outside src/cli/shell.js imports Electron.
src/
core/ the engine: model, documents, ML, mail, ERP, web, storage
server/ HTTP server + the RPC surface (was Electron's IPC channels)
cli/ argument parsing, subcommands, window launching, Electron shell
web/ the UIsrc/web/js/bridge.js exposes window.api over fetch and EventSource with
exactly the shape Electron's preload.js used to provide — which is why the UI
runs unmodified.
Development
bun install
bun run check # parse, load, bridge-surface and isolation checks
node bin/digitalomanai.jsbun run check is wired into prepack, so a broken tree cannot be published.
Licence
Proprietary, and free to use — see LICENSE.md. You may install and run it on any number of machines, for personal or commercial work, and do whatever you like with what it produces. You may not modify, redistribute or resell the software itself.
The source is published so you can see what runs on your machine, not so it can be copied into something else.
Built with Llama. The model is downloaded to your machine rather than distributed here, and your use of those weights is governed by the Llama 3.2 Community License and Meta's Acceptable Use Policy.
