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 componentsrc/components/App/index.js. - Core UI flow –
src/components/Paper/index.jscreates the SVG canvas, holds the main Redux store (src/store.js), and mounts lifecycle methods (componentDidMount,componentWillUnmount). It calls helpers insrc/components/Paper/helpers.js(e.g.,getSmoothPath,simplifyPoints). - State management – Redux slices in
src/reducers/(librarySlice.js,paperSlice.js, etc.) expose actions likeloadFolderContentsandexportPaper. These are invoked from UI components such assrc/components/Library/components/FolderListItem/index.jsandsrc/components/Paper/components/ExportButton/index.js. - Native bridge – Tauri commands defined in
src-tauri/src/commands.rsare reachable via the JavaScript API (not shown in the static graph). The Rust side reads/writes the compressed files and provides thefilemodule (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.jsand the Redux slicesrc/reducers/library/librarySlice.jsalso have multiple inbound/outbound edges.- Call graph highlights – Functions like
formatDate,shiftShapePoints, andonClickare each called from exactly two places, indicating limited but critical coupling. The most frequent internal edge isrender → 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_TOKENpermissions (.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: falseon checkout (.github/workflows/release.yml). - LOW – Add explicit
timeout-minutesto 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.