尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
A set of tools for collecting, organising, syncing, and viewing a personal media archive.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Latch Works is a private workshop for a personal media archive: a Chrome extension that collects, a native desktop app that reads and tidies, a sync client that pushes, and a web viewer that serves it all back to you on any device.
The local archive is the source of truth. Nothing is public, nothing is inferred from a cloud service. Remote access is explicit, authenticated, and read-only. Lockstep is the only write path.
The names follow a window-and-access metaphor: the latch controls access to the archive, Frame and Pane are the desktop and web viewing surfaces, the Box collects incoming media, and Lockstep keeps local and remote in step. The brand kit has the full vocabulary.
Pane View is a private web viewer for the synced archive. Galleries, videos, and comics on desktop, tablet, and phone. TanStack Start, PostgreSQL, S3, signed renditions via Shutter.
Oriel is the desktop app, native and written in Rust, with three modes. View, the gallery for local images, videos, and comics that began as Frame View, is where the UX gets decided: whatever feels right here gets ported to Pane View, not the other way around. Tidy (once Glazier) finds duplicates and converts files to the archive formats, with every change undoable.
Lockstep plans and pushes archive changes to Pane View. Use Oriel's Sync mode, with profiles, encrypted token storage, and run history, or the scriptable CLI over the same engine. Your pick.
Gather Box downloads image galleries and story PDFs from supported sites straight into inferred local folder structures, ready for the next scan.
Gather Box downloads a gallery
-> lands in the local archive as an inferred folder structure
-> Oriel's View mode reads it directly off disk
-> Lockstep scans the tree and builds a sync plan
-> plan: read-only diff of local vs remote
-> push: originals to S3, metadata to PostgreSQL
-> Pane View serves it back, authenticated and read-only
-> Shutter signs thumbnail and preview renditions on demand
The scan, sort, grouping, and plan logic all live in packages/. The Lockstep CLI and Pane View use them directly; Oriel ports them to Rust, and conformance vectors written by each package's tests hold its ports to the same answers, so a sorting rule changes everywhere or a check fails.
| Name | Path | What it does |
|---|---|---|
| Pane View | apps/pane-view | Private web viewer for a synced archive. TanStack Start + PostgreSQL + S3. |
| Oriel | apps/oriel | The desktop app, in Rust on GPUI, in three modes. View (once Frame View) is the gallery for local images, videos, and comics; PDF reading is planned, not shipped. Tidy (once Glazier) audits and tidies the local archive: exact and similar duplicates, sound, conversion to AVIF and MP4, with holding and undo. Sync (once the Lockstep desktop app) plans and pushes to Pane View with profiles, encrypted tokens, and run history. |
| Gather Box | apps/gather-box | Chrome extension that downloads galleries and story PDFs into local folder structures. |
| Lockstep CLI | apps/lockstep-cli | Scriptable plan / push / verify / doctor. npm package @latch-works/lockstep. |
| Showcase | apps/showcase | Astro product site and MDX docs: pages, screenshots, getting-started guides. |
| Package | Path | Role |
|---|---|---|
@latch-works/media-domain | packages/media-domain | Media types, path helpers, gallery sort / comic grouping, Zod schemas |
@latch-works/media-index | packages/media-index | Archive scanning and sync-plan generation |
@latch-works/media-storage | packages/media-storage | Content-addressed S3 object key conventions |
@latch-works/lockstep-core | packages/lockstep-core | Headless sync engine behind the Lockstep CLI, which Oriel's Sync mode ports to Rust |
@latch-works/media-format | packages/media-format | Archive format policy (AVIF stills, MP4 video) and encoder settings, used by Gather Box and ported to Rust for Oriel's Tidy mode |
Requires Node.js 24 and pnpm 12 (corepack enable). Oriel additionally needs Rust (rustup installs the pinned toolchain) and Xcode's command-line tools; its runbook has the rest. Pane View additionally needs PostgreSQL, S3-compatible storage, and Shutter access for signed renditions.
pnpm install
Shared packages build to dist/ and app dev servers import from there, so build them once up front:
pnpm -r --filter './packages/*' build
Then run the full workspace check. It builds everything, runs each package's checks, then lint and knip:
pnpm check
pnpm dev:pane # Pane View → http://127.0.0.1:3000
pnpm --filter @latch-works/showcase dev # Showcase → http://127.0.0.1:3100
pnpm --filter @latch-works/oriel dev # Oriel: View, Tidy and Sync (a debug build)
pnpm --filter @latch-works/gather-box build # Gather Box → dist/, load unpacked in Chrome
pnpm --filter @latch-works/oriel bundle # Oriel.app, in apps/oriel/target/release/bundle
Oriel is built from source and unsigned. In apps/oriel, cargo run -p xtask -- dmg makes its
DMG and cargo run -p xtask -- package windows its Setup.exe on Windows; the
runbook has each OS's prerequisites and how to open an unsigned build.
plan is read-only. It scans the source tree and prints what would change:
pnpm --filter @latch-works/lockstep start plan --source "/path/to/archive"
push writes to a running Pane View instance:
export LOCKSTEP_API_URL="http://127.0.0.1:3000"
export LOCKSTEP_API_TOKEN="your-sync-token"
pnpm --filter @latch-works/lockstep start push --source "/path/to/archive"
pnpm start:lockstep with no arguments opens an interactive wizard when run on a TTY. Full reference: apps/lockstep-cli/README.md and the runbook.
pnpm lint:all # Runs both Biome and Oxlint with the Anti-slop plugin
pnpm test # Tests in all packages
pnpm typecheck # tsc across all packages
pnpm knip # Unused files, exports, dependencies
pnpm oriel:check # Oriel's Rust workspace: cargo fmt, clippy and tests
| Doc | Description |
|---|---|
docs/ARCHITECTURE.md | System architecture and the Shutter delivery model |
docs/runbooks/lockstep.md | Lockstep operations runbook |
docs/runbooks/oriel.md | Oriel: building, running and packaging it; what each Tidy action does to the archive, holding, undo |
docs/runbooks/oriel-windows.md | Oriel on Windows |
docs/adr/ | Architecture decision records |
docs/latch-works-brand-kit.md | Naming, tone, and product vocabulary |
apps/showcase/README.md | Showcase dev server and screenshot capture |