n-link/desktop
Your Name 4b9096250b fix(desktop): commit the app shell files Task 9 left unstaged
The app-shell commit (f45e893) added Home.vue, About.vue, and the router
but never staged App.vue, main.ts, or index.html. HEAD therefore still
contained Plan A's debug harness and a main.ts that wired neither the
router nor the device store — a fresh checkout would have built the
harness, not the real UI.

The working tree had the correct content all along, which is why the
running app was right and the verification (a grep against the working
tree, not the commit) passed.

- App.vue: harness replaced by router-view + tailwind import
- main.ts: router, globalProperties.$devices, provide(DEVICES_KEY)
- index.html: drop the scaffold's vite.svg favicon link

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 08:16:58 -04:00
..
.cargo Move to workspace 2020-10-01 21:22:35 -04:00
src fix(desktop): commit the app shell files Task 9 left unstaged 2026-07-22 08:16:58 -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 fix(desktop): commit the app shell files Task 9 left unstaged 2026-07-22 08:16:58 -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(desktop): README no longer needs --legacy-peer-deps; document web exclusion 2026-07-22 08:06:06 -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

--legacy-peer-deps is no longer needed — n-link-core is on Vue 3 as of the frontend port.

Note that the root package.json workspaces list contains only desktop and n-link-core. web/ is deliberately excluded: it is still on Nuxt 2 and pulls tailwindcss@1.9.6, which npm hoists to the root and which then shadows the tailwindcss@3 that desktop and @tailwindcss/forms require. Restore the entry when web is migrated.

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.