The Problem

Users need a lightweight, offline white‑board that can persist drawings locally without a server. Existing solutions are either web‑only, require cloud sync, or are heavyweight desktop apps that add unnecessary dependencies.

What This Does

pointless delivers a native desktop canvas built with Tauri (Rust) and React. The UI lives in src/ (e.g., src/components/Paper/index.js, src/helpers.js) while the native bridge lives in src‑tauri/ (src-tauri/src/main.rs). State is stored locally using Brotli‑Unicode compression (src/utils/paper-export.js). The app ships as a single binary per platform, avoiding runtime Node or Python installations.

How It Is Wired

  • Entry point – The UI bootstraps from public/index.html → src/index.js → React component src/components/App/index.js.
  • Core UI flow – src/components/Paper/index.js creates the SVG canvas, holds the main Redux store (src/store.js), and mounts lifecycle methods (componentDidMount, componentWillUnmount). It calls helpers in src/components/Paper/helpers.js (e.g., getSmoothPath, simplifyPoints).
  • State management – Redux slices in src/reducers/ (librarySlice.js, paperSlice.js, etc.) expose actions like loadFolderContents and exportPaper. These are invoked from UI components such as src/components/Library/components/FolderListItem/index.js and src/components/Paper/components/ExportButton/index.js.
  • Native bridge – Tauri commands defined in src-tauri/src/commands.rs are reachable via the JavaScript API (not shown in the static graph). The Rust side reads/writes the compressed files and provides the file module (src-tauri/src/file.rs).
  • High‑impact modules –
  • src/components/Paper/index.js (7 functions, 1 class, 1117 lines) is the most blast‑radius hub; any change ripples through the UI.
  • src/helpers.js (6 exported utilities, 23 branches) is heavily imported (6 callers).
  • src/components/Library/index.js and the Redux slice src/reducers/library/librarySlice.js also have multiple inbound/outbound edges.
  • Call graph highlights – Functions like formatDate, shiftShapePoints, and onClick are each called from exactly two places, indicating limited but critical coupling. The most frequent internal edge is render → formatDate (4×). No circular module dependencies were detected.

How To Use It

# Clone the fork you will work on
git clone https://github.com/moses-y/pointless && cd pointless

# Install dependencies (Yarn is declared in package.json)
yarn install

# Run the development server (starts Tauri + React)
yarn run tauri dev

# Build a production binary for the host platform
yarn run tauri build

No additional configuration files or environment variables are required; the app stores its data in the user's local app data directory.

Real‑World Use

A design team can drop the binary onto each workstation, open Pointless, and sketch UI mock‑ups that are saved locally as compressed .ptls files. Export buttons (src/components/Paper/components/ExportButton/index.js) allow PNG/JPEG/SVG output for inclusion in documentation without any network transfer.

Code Health & Issues

  • HIGH – Pin GitHub Action versions to commit SHAs (.github/workflows/*.yml).
  • HIGH – No test suite present despite 36 source files.
  • MEDIUM – Declare least‑privilege GITHUB_TOKEN permissions (.github/workflows/tests.yml).
  • MEDIUM – Enable Dependabot or Renovate for dependency updates.
  • MEDIUM – Install dependencies from lockfile (yarn install --immutable).
  • MEDIUM – Add a dependency‑vulnerability scan step in CI.
  • MEDIUM – Set persist-credentials: false on checkout (.github/workflows/release.yml).
  • LOW – Add explicit timeout-minutes to workflow jobs (.github/workflows/release.yml).
  • MEDIUM – High branching density in src/helpers.js (23 branches / 57 lines).
  • MEDIUM – Oversized file src/components/Paper/index.js (1117 lines) makes maintenance difficult.

All findings are derived from deterministic static analysis; no additional issues were inferred.

The Bottom Line

pointless provides a functional, offline drawing canvas with a clean Rust‑React stack, but the codebase suffers from a few maintainability hot spots (large files, high cognitive load) and lacks automated testing. It is suitable for teams that need a simple, self‑contained whiteboard and are comfortable adding tests and refactoring the core UI module.