Commit Graph

442 Commits

Author SHA1 Message Date
Henry Estela
1e1da483e9
feat(AI): enable flash_attn by default and disable ollama cloud (#616)
New defaults:
OLLAMA_NO_CLOUD=1 - "Ollama can run in local only mode by disabling
Ollama’s cloud features. By turning off Ollama’s cloud features, you
will lose the ability to use Ollama’s cloud models and web search."
https://ollama.com/blog/web-search
https://docs.ollama.com/faq#how-do-i-disable-ollama%E2%80%99s-cloud-features
example output:
```
ollama run minimax-m2.7:cloud
Error: ollama cloud is disabled: remote model details are unavailable
```
This setting can be safely disabled as you have to click on a link to
login to ollama cloud and theres no real way to do that in nomad outside
of looking at the nomad_ollama logs.

This one can be disabled in settings in case theres a model out there
that doesn't play nice. but that doesnt seem necessary so far.
OLLAMA_FLASH_ATTENTION=1 - "Flash Attention is a feature of most modern
models that can significantly reduce memory usage as the context size
grows. "

Tested with llama3.2:
```
docker logs nomad_ollama --tail 1000 2>&1 |grep --color -i flash_attn
llama_context: flash_attn    = enabled
```

And with second_constantine/deepseek-coder-v2 with is based on
https://huggingface.co/lmstudio-community/DeepSeek-Coder-V2-Lite-Instruct-GGUF
which is a model that specifically calls out that you should disable
flash attention, but during testing it seems ollama can do this for you
automatically:
```
docker logs nomad_ollama --tail 1000 2>&1 |grep --color -i flash_attn
llama_context: flash_attn    = disabled
```
2026-04-01 19:52:11 -07:00
Jake Turner
a9942f1e1b
fix(Jobs): improved error handling and robustness 2026-04-02 02:49:33 +00:00
chriscrosstalk
15c11c98b9
feat(UI): add Installed Models section to AI Assistant settings (#612)
Surfaces all installed AI models in a dedicated table between Settings
and Active Model Downloads, so users can quickly see what's installed
and delete models without hunting through the expandable model catalog.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:06:53 -07:00
Jake Turner
7543d0ce6c
fix(Maps): remove unused import 2026-04-01 23:01:02 +00:00
chriscrosstalk
4dcf2e9921
feat(downloads): rich progress, friendly names, cancel, and live status (#554)
* feat(downloads): rich progress, friendly names, cancel, and live status

Redesign the Active Downloads UI with four improvements:

- Rich progress: BullMQ jobs now report downloadedBytes/totalBytes instead
  of just a percentage, showing "2.3 GB / 5.1 GB" instead of "78% / 100%"
- Friendly names: dispatch title metadata from curated categories, Content
  Explorer library, Wikipedia selector, and map collections
- Cancel button: Redis-based cross-process abort signal lets users cancel
  active downloads with file cleanup. Confirmation step prevents accidents.
- Live status indicator: green pulsing dot with transfer speed for active
  downloads, orange stall warning after 60s of no data, gray dot for queued

Backward compatible with in-flight jobs that have integer-only progress.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(downloads): fix cancel, dismiss, speed, and retry bugs

- Speed indicator: only set prevBytesRef on first observation to prevent
  intermediate re-renders from inflating the calculated speed
- Cancel: throw UnrecoverableError on abort to prevent BullMQ retries
- Dismiss: remove stale BullMQ lock before job.remove() so cancelled
  jobs can actually be dismissed
- Retry: add getActiveByUrl() helper that checks job state before
  blocking re-download, auto-cleans terminal jobs
- Wikipedia: reset selection status to failed on cancel so the
  "downloading" state doesn't persist

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(downloads): improve cancellation logic and surface true BullMQ job states

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Jake Turner <jturner@cosmistack.com>
2026-04-01 15:55:13 -07:00
0xGlitch
d03d59a843
fix(queue): increase BullMQ lockDuration to prevent download stalls (#604) 2026-04-01 15:39:30 -07:00
David Gross
31d4f9c661
fix(Maps): add x-forwarded-proto support to handle https termination (#600) 2026-04-01 15:28:11 -07:00
Henry Estela
85359376a2
feat: switch all PNG images to WEBP (#575)
* feat(web): Switch all png except favicon to webp format
* fix(docs): use relative path for README project logo
2026-04-01 15:06:15 -07:00
Sebastion
7ebf94158c
fix: block IPv4-mapped IPv6 and IPv6 all-zeros in SSRF check (#520)
The assertNotPrivateUrl() function blocked standard loopback and link-local
addresses but could be bypassed using IPv4-mapped IPv6 representations:

  - http://[::ffff:127.0.0.1]:8080/ → loopback bypass
  - http://[::ffff:169.254.169.254]:8080/ → metadata endpoint bypass
  - http://[::]:8080/ → all-interfaces bypass

Node.js normalises these to [::ffff:7f00:1], [::ffff:a9fe:a9fe], and [::]
respectively, none of which matched the existing regex patterns.

Add two patterns to close the gap:
  - /^\[::ffff:/i catches all IPv4-mapped IPv6 addresses
  - /^\[::\]$/ catches the IPv6 all-zeros address

Legitimate RFC1918 LAN URLs (192.168.x, 10.x, 172.16-31.x) remain allowed.
2026-04-01 15:01:50 -07:00
Luís Miguel
27e6c2308a
fix(security): validate key parameter on settings read endpoint#517
Co-authored-by: Jake Turner <52841588+jakeaturner@users.noreply.github.com>
2026-04-01 14:56:19 -07:00
Jake Turner
cd9a78b473
feat: support adding labels on dynamic container creation (#620)
Co-authored-by: Benjamin Sanders <ben@benjaminsanders.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:12:28 -07:00
chriscrosstalk
a3f164d695
fix(UI): constrain install activity feed height with auto-scroll (#611)
The App Installation Activity list on the Easy Setup complete page grew
unboundedly, pushing Active Downloads off-screen. Caps the list at ~8
visible items with overflow scrolling, auto-scrolling to keep the latest
activity visible.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 10:32:26 -07:00
0xGlitch
01699ff11d
feat(maps): add global map download from Protomaps (#525)
* feat(maps): add global map download from Protomaps
* fix: add path traversal check to global map download
2026-04-01 10:30:13 -07:00
Sam
6e4352928e
docs(readme): format Quick Install command as multiline bash (#569) 2026-04-01 10:26:06 -07:00
chriscrosstalk
c15387c126
fix(install): add gpg as a required dependency (#574)
The NVIDIA container toolkit setup requires gpg to dearmor the GPG key,
but minimal Debian/Ubuntu installs may not have it present. Adds gpg to
the dependency check alongside curl so it gets installed automatically.

Closes #522

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 10:23:03 -07:00
Jake Turner
6642400e87
build: regen lockfile 2026-04-01 17:22:30 +00:00
arn6694
80803269fe
feat(rag): add EPUB file support for Knowledge Base uploads (#257) 2026-04-01 17:22:30 +00:00
Salman Chishti
11cbf6dac9
ci: upgrade GitHub Actions to latest versions (#362) 2026-04-01 17:22:30 +00:00
dependabot[bot]
c6d2c7353e
build(deps): bump file-type from 21.3.0 to 21.3.2 in /admin (#283)
Bumps [file-type](https://github.com/sindresorhus/file-type) from 21.3.0 to 21.3.2.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/compare/v21.3.0...v21.3.2)

---
updated-dependencies:
- dependency-name: file-type
  dependency-version: 21.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-01 17:22:30 +00:00
Henry Estela
d7cb59074e
feat(AI): enable remote AI chat host 2026-04-01 17:22:30 +00:00
Henry Estela
44ecf41ca6 Add model download to FAQ.md 2026-03-26 23:12:49 -07:00
cosmistack-bot
5c92c89813 docs(release): finalize v1.30.3 release notes [skip ci] 2026-03-25 23:40:34 +00:00
cosmistack-bot
f9e3773ec3 chore(release): 1.30.3 [skip ci] 2026-03-25 23:39:41 +00:00
cosmistack-bot
e5a7edca03 chore(release): 1.30.3-rc.2 [skip ci] 2026-03-25 16:30:35 -07:00
Jake Turner
bd015f4c56 fix(UI): improve version display in Settings sidebar (#547) 2026-03-25 16:30:35 -07:00
Jake Turner
0e60e246e1 ops: remove deprecated sidecar-updater files from install script (#546) 2026-03-25 16:30:35 -07:00
Jake Turner
c67653b87a fix(UI): use StyledButton in TierSelectionModal for consistency (#543) 2026-03-25 16:30:35 -07:00
cosmistack-bot
643eaea84b chore(release): 1.30.3-rc.1 [skip ci] 2026-03-25 16:30:35 -07:00
Jake Turner
150134a9fa docs: update release notes 2026-03-25 16:30:35 -07:00
Tom Boucher
6b558531be fix: surface actual error message when service installation fails
Backend returned { error: message } on 400 but frontend expected { message }.
catchInternal swallowed Axios errors and returned undefined, causing a
generic 'An internal error occurred' message instead of the real reason
(already installed, already in progress, not found).

- Fix 400 response shape to { success: false, message } in controller
- Replace catchInternal with direct error handling in installService,
  affectService, and forceReinstallService API methods
- Extract error.response.data.message from Axios errors so callers
  see the actual server message
2026-03-25 16:30:35 -07:00
Bortlesboat
4642dee6ce fix: benchmark scores clamped to 0% for below-average hardware
The log2 normalization formula `50 * (1 + log2(ratio))` produces negative
values (clamped to 0) whenever the measured value is less than half the
reference. For example, a CPU scoring 1993 events/sec against a 5000
reference gives ratio=0.4, log2(0.4)=-1.32, score=-16 -> 0%.

Fix by dividing log2 by 3 to widen the usable range. This preserves the
50% score at the reference value while allowing below-average hardware
to receive proportional non-zero scores (e.g., 28% for the CPU above).

Also adds debug logging for CPU sysbench output parsing to aid future
diagnosis of parsing issues.

Fixes #415
2026-03-25 16:30:35 -07:00
Chris Sherwood
78c0b1d24d fix(ai): surface model download errors and prevent silent retry loops
Model downloads that fail (e.g., when Ollama is too old for a model)
were silently retrying 40 times with no UI feedback. Now errors are
broadcast via SSE and shown in the Active Model Downloads section.
Version mismatch errors use UnrecoverableError to fail immediately
instead of retrying. Stale failed jobs are cleared on retry so users
aren't permanently blocked.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 16:30:35 -07:00
Jake Turner
0226e651c7 fix: bump default ollama and cyberchef versions 2026-03-25 16:30:35 -07:00
LuisMIguelFurlanettoSousa
7ab5e65826 fix(zim): adicionar método deleteZimFile ausente no API client
O Content Manager chamava api.deleteZimFile() para deletar arquivos
ZIM, mas esse método nunca foi implementado na classe API, causando
"TypeError: deleteZimFile is not a function".

O backend (DELETE /api/zim/:filename → ZimController.delete) já
existia e funcionava corretamente — só faltava o método no client
frontend que faz a ponte.

Closes #372
2026-03-25 16:30:35 -07:00
Chris Sherwood
b7ed8b6694 docs: add installation guide link to README
Link to the full step-by-step install walkthrough on projectnomad.us/install,
placed below the Quick Install command for users who need Ubuntu setup help.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 16:30:35 -07:00
builder555
4443799cc9 fix(Collections): update ZIM files to latest versions (#332)
* fix: update data sources to newer versions
* fix: bump spec version for wikipedia
2026-03-25 16:30:35 -07:00
Divyank Singh
4219e753da build: increase mysql healthcheck retries to avoid race condition on lower-end hardware (#480) 2026-03-25 16:30:35 -07:00
Chris Sherwood
f00bfff77c fix(install): prevent MySQL credential mismatch on reinstall
When the install script runs a second time (e.g., after a failed first
attempt), it generates new random database passwords and writes them to
compose.yml. However, MySQL only initializes credentials on first startup
when its data directory is empty. If /opt/project-nomad/mysql/ persists
from the previous attempt, MySQL skips initialization and keeps the old
passwords, causing "Access denied" errors for nomad_admin.

Fix: remove the MySQL data directory before generating new credentials
so MySQL reinitializes with the correct passwords.

Closes #404

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 16:30:35 -07:00
chriscrosstalk
5e93f2661b fix: correct Rogue Support URL on Support the Project page (#472)
roguesupport.com changed to rogue.support (the actual domain).
Updates href and display text in two places.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 16:30:35 -07:00
Brenex
9a8378d63a
build: fix grep command in install script for NVIDIA runtime detection (#526) 2026-03-25 14:36:19 -07:00
Salman Chishti
982dceb949
ci: upgrade checkout action version (#361) 2026-03-25 14:31:53 -07:00
Jake Turner
6a1d0e83f9
ci: bump checkout action veon build-sidecar and validate-collections 2026-03-25 21:29:51 +00:00
Jake Turner
edcfd937e2
ci: add build check for PRs 2026-03-25 20:41:53 +00:00
Jake Turner
f9062616b8
docs: add FAQ 2026-03-25 06:04:17 +00:00
Jake Turner
efe6af9b24
ci: add collection URLs validation check 2026-03-24 05:31:53 +00:00
Jake Turner
8b96793c4d
build: add latest initial zim file 2026-03-24 02:08:18 +00:00
cosmistack-bot
735b9e8ae6 chore(release): 1.30.2 [skip ci] 2026-03-23 19:47:10 +00:00
Chris Sherwood
c409896718 fix(collections): update Full Wikipedia URL to current Kiwix mirror
The 2024-01 all_maxi ZIM was removed from Kiwix mirrors, causing
silent 404 failures for users selecting "Complete Wikipedia (Full)".
Updated to 2026-02 release (115 GB).

Closes #216

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:46:26 -07:00
Philip L. Welch
f004c002a7 docs: fix typo in README url 2026-03-20 17:15:56 -07:00
cosmistack-bot
d501d2dc7e chore(release): 1.30.1 [skip ci] 2026-03-20 19:29:55 +00:00