n-link/desktop
Your Name f45e893bba feat(desktop): port app shell to Vue 3, replace verification harness
Router to vue-router 4 with hash history (custom protocol has no server
for path-based deep links). createApp replaces new Vue. The device store
is registered on globalProperties so n-link-core templates keep resolving
$devices, and also provided via DEVICES_KEY for <script setup> injection.
Removes Plan A's temporary harness and scaffold assets.

Also renames desktop/postcss.config.js and tailwind.config.js to .cjs:
with "type": "module" in desktop/package.json, Node treated their
`module.exports`/`require` as ES module syntax and errored. This was
latent since the Vue 3 foundation task because nothing previously
imported n-link-core/assets/tailwind.css for real; this task's App.vue
is the first to trigger postcss processing during the build.
2026-07-22 07:35:33 -04:00
..
.cargo Move to workspace 2020-10-01 21:22:35 -04:00
src feat(desktop): port app shell to Vue 3, replace verification harness 2026-07-22 07:35:33 -04:00
src-tauri fix(desktop): run blocking USB commands on the blocking pool 2026-07-21 20:37:09 -04:00
.gitignore feat(desktop): replace Tauri 1 / Vue CLI tree with Tauri 2 + Vue 3 + Vite scaffold 2026-07-19 09:36:36 -04:00
app-icon.png Move to workspace 2020-10-01 21:22:35 -04:00
app-icon.svg Move to workspace 2020-10-01 21:22:35 -04:00
index.html feat(desktop): replace Tauri 1 / Vue CLI tree with Tauri 2 + Vue 3 + Vite scaffold 2026-07-19 09:36:36 -04:00
LICENSE Move to workspace 2020-10-01 21:22:35 -04:00
package.json feat(frontend): Vue 3 foundation — Tailwind 3, Vite alias, shared types 2026-07-21 20:44:28 -04:00
postcss.config.cjs feat(desktop): port app shell to Vue 3, replace verification harness 2026-07-22 07:35:33 -04:00
README.md docs+chore: address final review findings 2026-07-19 21:41:28 -04:00
tailwind.config.cjs feat(desktop): port app shell to Vue 3, replace verification harness 2026-07-22 07:35:33 -04:00
tsconfig.json feat(desktop): replace Tauri 1 / Vue CLI tree with Tauri 2 + Vue 3 + Vite scaffold 2026-07-19 09:36:36 -04:00
tsconfig.node.json feat(desktop): replace Tauri 1 / Vue CLI tree with Tauri 2 + Vue 3 + Vite scaffold 2026-07-19 09:36:36 -04:00
vite.config.ts feat(frontend): Vue 3 foundation — Tailwind 3, Vite alias, shared types 2026-07-21 20:44:28 -04:00

N-Link

Free, cross-platform, CX-II compatible computer linking program for the TI-Nspire.

This package is a Tauri 2 + Vue 3 + Vite application. It was ported from Tauri 1.0.0-beta.8 / Vue CLI, which linked webkit2gtk-4.0 and could not build or run on current distributions (Ubuntu 26.04 ships only webkit2gtk-4.1).

Currently Linux-only: bundle targets are deb and appimage.

Prerequisites

  • Node.js 22+ (npm ships with it — this project uses npm workspaces, not yarn)
  • Rust 1.97+
  • System libraries (Ubuntu/Debian):
sudo apt-get install -y \
  libwebkit2gtk-4.1-dev \
  libjavascriptcoregtk-4.1-dev \
  libsoup-3.0-dev \
  librsvg2-dev \
  libxdo-dev \
  libayatana-appindicator3-dev \
  libusb-1.0-0-dev \
  build-essential curl wget file

Verify they resolve before building:

for p in webkit2gtk-4.1 javascriptcoregtk-4.1 libsoup-3.0 gtk+-3.0 libusb-1.0; do
  printf "%-24s " "$p"; pkg-config --modversion "$p" || echo MISSING
done

Setup

Run from the repository root (this is a workspace member):

npm install --workspace desktop --legacy-peer-deps

--legacy-peer-deps is currently required: the sibling n-link-core package is still on Vue 2 and its peer ranges conflict. It can be dropped once n-link-core is ported to Vue 3.

Development

cd desktop
npm run tauri dev

Production build

cd desktop
npm run tauri build

Produces src-tauri/target/release/bundle/deb/*.deb and .../appimage/*.AppImage.

Headless CLI

The same binary works without a GUI:

./src-tauri/target/release/n-link --help
./src-tauri/target/release/n-link ls /

Notes and gotchas

  • cargo commands need dist/ to exist. Tauri's generate_context! macro validates the frontendDist path at compile time, so a bare cargo check / cargo build in src-tauri/ fails on a fresh clone until the frontend has been built once: npm run build --workspace desktop. npm run tauri build does this for you.
  • Do not run the binary from a snap-confined shell (for example, the integrated terminal of VS Code installed as a snap). Snap injects an LD_LIBRARY_PATH whose libpthread shadows the system one, producing undefined symbol: __libc_pthread_init. Use a normal terminal.
  • AppImage needs FUSE. Without it, run the AppImage with --appimage-extract and launch squashfs-root/AppRun instead.
  • vendor/libnspire-sys at the repo root is a locally patched crate wired in via [patch.crates-io]. It raises the CX II NNSE handshake retry limit (10 → 30). The build will not reproduce upstream behaviour without it.
  • Known upstream limitation: libnspire's CX II support has been frozen since 2020. Against current CX II firmware, data transfers may return Busy or hang. This is independent of the Tauri version and is not a defect in this port.