Run prettier on all relevant files
This commit is contained in:
@@ -1,29 +1,30 @@
|
||||
---
|
||||
id: doc-8
|
||||
title: 'Opus 4.7, xhigh analysis'
|
||||
title: "Opus 4.7, xhigh analysis"
|
||||
type: other
|
||||
created_date: '2026-05-04 15:08'
|
||||
updated_date: '2026-05-04 15:10'
|
||||
created_date: "2026-05-04 15:08"
|
||||
updated_date: "2026-05-04 15:10"
|
||||
---
|
||||
|
||||
# Nerves Deployment Research — Findings
|
||||
|
||||
Three parallel research agents covered NIFs, SQLite extensions, and Litestream replication semantics. The user's concerns were well-founded: there are real blockers, but most are solvable with custom Nerves system work. The Litestream question reframes the architecture more than expected.
|
||||
|
||||
## 1. Native libraries (NIFs on aarch64-linux-musl)
|
||||
|
||||
| Library | aarch64-gnu | aarch64-musl | Status |
|
||||
|---|---|---|---|
|
||||
| `mdex` | ✅ | ✅ | Fine |
|
||||
| `lumis` | ✅ | ✅ | Fine |
|
||||
| `typst` | ✅ | ✅ | **Nerves-aware** — has `@nerves_rust_target_triple_mapping` in mix.exs |
|
||||
| `ecto_sqlite3` / `exqlite` | ✅ | ✅ | Driver fine; designed with embedded use in mind. Extensions are the issue (see §2) |
|
||||
| `dominant_colors` | likely | unknown | Verify GitHub releases; if missing, request musl target from maintainer |
|
||||
| `vix` | partial | ❌ | **Major blocker** |
|
||||
| `cloak_ecto` | n/a | n/a | Pure Elixir + `:crypto` |
|
||||
| Library | aarch64-gnu | aarch64-musl | Status |
|
||||
| -------------------------- | ----------- | ------------ | ---------------------------------------------------------------------------------- |
|
||||
| `mdex` | ✅ | ✅ | Fine |
|
||||
| `lumis` | ✅ | ✅ | Fine |
|
||||
| `typst` | ✅ | ✅ | **Nerves-aware** — has `@nerves_rust_target_triple_mapping` in mix.exs |
|
||||
| `ecto_sqlite3` / `exqlite` | ✅ | ✅ | Driver fine; designed with embedded use in mind. Extensions are the issue (see §2) |
|
||||
| `dominant_colors` | likely | unknown | Verify GitHub releases; if missing, request musl target from maintainer |
|
||||
| `vix` | partial | ❌ | **Major blocker** |
|
||||
| `cloak_ecto` | n/a | n/a | Pure Elixir + `:crypto` |
|
||||
|
||||
**`vix` is the dominant blocker.** Two compounding issues:
|
||||
|
||||
- It loads the NIF at *compile time* (macro-driven introspection), which breaks cross-compilation on stock Nerves systems. fhunleth (Nerves core) discussed this in a 2023 ElixirForum thread; the conclusion was "no easy Elixir-level fix."
|
||||
- It loads the NIF at _compile time_ (macro-driven introspection), which breaks cross-compilation on stock Nerves systems. fhunleth (Nerves core) discussed this in a 2023 ElixirForum thread; the conclusion was "no easy Elixir-level fix."
|
||||
- libvips itself is not in `nerves_system_rpi4` / `nerves_system_rpi5`. You'd need a **custom Nerves system** with `BR2_PACKAGE_LIBVIPS=y` in Buildroot, then `VIX_COMPILATION_MODE=PLATFORM_PROVIDED_LIBVIPS`.
|
||||
|
||||
This is doable (15–30 min Buildroot rebuild, well-documented) but it commits you to maintaining a custom Nerves system. That single decision affects everything downstream — once you're building custom systems, ICU and sqlite-vec become "while we're at it" additions.
|
||||
@@ -51,7 +52,7 @@ Both extensions are blockers on stock Nerves systems for the same root reason
|
||||
|
||||
## 3. Litestream replication — this is the architectural pivot
|
||||
|
||||
**Headline:** Litestream is *not* a multi-master replicator. It's a one-way backup tool. If the Nerves device writes locally, those writes are lost on the next restore — no conflict detection, no reconciliation, no merge.
|
||||
**Headline:** Litestream is _not_ a multi-master replicator. It's a one-way backup tool. If the Nerves device writes locally, those writes are lost on the next restore — no conflict detection, no reconciliation, no merge.
|
||||
|
||||
**Two viable replica modes today (both newer than the docs you may remember):**
|
||||
|
||||
@@ -83,6 +84,7 @@ The **biggest non-obvious unknown** is the Litestream architecture decision. Goi
|
||||
## Sources
|
||||
|
||||
### NIF / Phoenix-on-Nerves
|
||||
|
||||
- [Underjord: LiveView on Nerves](https://underjord.io/liveview-on-nerves.html)
|
||||
- [ElixirForum: Cross Compiling with NIF as compilation dependency (vix/Nerves thread)](https://elixirforum.com/t/cross-compiling-with-nif-as-compilation-dependency/59821)
|
||||
- [Nerves docs: Compiling Non-BEAM Code](https://hexdocs.pm/nerves/compiling-non-beam-code.html)
|
||||
@@ -96,6 +98,7 @@ The **biggest non-obvious unknown** is the Litestream architecture decision. Goi
|
||||
- [Customizing Your Nerves System](https://hexdocs.pm/nerves/customizing-systems.html)
|
||||
|
||||
### SQLite extensions
|
||||
|
||||
- [Releases · asg017/sqlite-vec](https://github.com/asg017/sqlite-vec/releases)
|
||||
- [Fix for musl compile PR #199 · asg017/sqlite-vec](https://github.com/asg017/sqlite-vec/pull/199)
|
||||
- [Build and install exqlite with sqlcipher into nerves rpi5 image — ElixirForum](https://elixirforum.com/t/build-and-install-exqlite-with-sqlcipher-into-nerves-rpi5-image/75089)
|
||||
@@ -105,6 +108,7 @@ The **biggest non-obvious unknown** is the Litestream architecture decision. Goi
|
||||
- [Advanced Configuration — Nerves](https://hexdocs.pm/nerves/advanced-configuration.html)
|
||||
|
||||
### Litestream
|
||||
|
||||
- [Live Read Replication — Litestream (tip)](https://tip.litestream.io/guides/read-replica/)
|
||||
- [VFS Read Replicas — Litestream](https://litestream.io/guides/vfs/)
|
||||
- [How it works — Litestream](https://litestream.io/how-it-works/)
|
||||
|
||||
Reference in New Issue
Block a user