n-link/desktop
Your Name 49e9e3879e feat(frontend): Vue 3 foundation — Tailwind 3, Vite alias, shared types
Migrates n-link-core's Tailwind config from 1.x to 3.x (drops future/
variants/purge, swaps custom-forms for @tailwindcss/forms) and replaces
the Vue 2 'vue/types/vue' augmentation with Vue 3
ComponentCustomProperties. Deletes the Vue 2 shims.
2026-07-21 20:44:28 -04:00
..
.cargo Move to workspace 2020-10-01 21:22:35 -04:00
public feat(desktop): replace Tauri 1 / Vue CLI tree with Tauri 2 + Vue 3 + Vite scaffold 2026-07-19 09:36:36 -04:00
src test(desktop): add temporary backend verification harness 2026-07-19 19:48:03 -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.js feat(frontend): Vue 3 foundation — Tailwind 3, Vite alias, shared types 2026-07-21 20:44:28 -04:00
README.md docs+chore: address final review findings 2026-07-19 21:41:28 -04:00
tailwind.config.js feat(frontend): Vue 3 foundation — Tailwind 3, Vite alias, shared types 2026-07-21 20:44:28 -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.