Skip to content
fareedstPublic

About

A modern multi-pane file manager built with Next.js, React 19, TypeScript, and Tailwind CSS v4, following Semantic Token-Driven Development (STDD) methodology for complete traceability from requirements through implementation.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

65 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Panorama - Multi-Target File Manager with Visual Sync

Version: 0.5.1
Last Updated: 2026-05-31

Panorama is a modern multi-pane file manager built for visual multi-destination sync with verification β€” see all targets at once and confirm every copy. Built with Next.js, React 19, TypeScript, and Tailwind CSS v4, following TIED (Traceability-Integrated Engineering Documentation) methodology for complete traceability from requirements through implementation. Project records live under tied/.

Browse and manage server files with keyboard-driven navigation, 1 pane or more (no upper limit; 3 panes by default), file operations, visual comparison across panes, content search, and a comprehensive toolbar system with 36+ discoverable operations.

Why Panorama?

The Problem: Traditional file managers only show two panes. When syncing files to multiple destinations (backup drives, cloud storage, network shares), you can't see all targets simultaneously, making it hard to verify what went where.

The Solution: Panorama's multi-pane layout shows all your destinations at once. Copy or move files to every visible pane in a single operation, with visual comparison to verify results instantly.

Use Cases:

  • Multi-Target Backup: Copy important files to 2-3 backup drives simultaneously and verify each destination
  • Directory Comparison: Open 3-5 versions of a project and see differences across all at once with color-coded indicators
  • Parallel Deployment: Sync files to multiple servers and visually confirm each deployment
  • USB Drive Sync: Copy media to multiple devices in one operation, see all targets' contents side-by-side
  • Archive Distribution: Distribute files to multiple locations and verify nothing was missed

Features

Core File Manager

  • Multi-Pane Layout – 1 pane or more, no upper limit; 3 panes by default. Add or remove panes via the Layout toolbar; configurable startup paths and automatic layout calculation
  • Keyboard Navigation – Vim-inspired keybindings with hjkl movement, Enter to open directories, Backspace for parent, Tab to switch panes
  • File Operations – Copy, move, delete, rename with visual confirmation dialogs and progress feedback
  • Linked Navigation [REQ-LINKED_PANES] – Toggleable mode (L key) synchronizes directory changes, cursor position, and sort settings across all panes; Parent button respects linked mode automatically
  • Visual Comparison – Cross-pane file comparison with color-coded indicators (same, different, unique, size, time)
  • Parent Navigation Button – Mouse-accessible .. button in each pane header for navigating to parent directory (visible when not at root)
  • Content Search – Full-text search across files with regex support, recursive directory scanning, and match highlighting
  • Finder Dialog – Quick file filtering with fuzzy matching (press / to activate)
  • Directory History – Navigate back/forward through visited directories with cursor position restoration
  • Bookmarks – Save frequently accessed directories for quick navigation
  • Manual Refresh – Force refresh current pane (Ctrl+R) or all panes to reflect external file system changes
  • Sort Options – Sort by name, size, modification time, or extension (ascending/descending, directories first)
  • File Marking – Mark multiple files for bulk operations (Space to mark, Shift+M to mark all)

Visual Toolbar System [REQ-TOOLBAR_SYSTEM]

  • Three Toolbar Types: Workspace (global actions like layout/refresh), Pane (file operations), System (help/search)
  • Compact Icon Design: Icon + keystroke badges for maximum density (no overflow with 12+ buttons)
  • Context Awareness: Active/disabled states reflect workspace context (e.g., Copy disabled without marks)
  • Configuration-Driven: Complete customization via config/files.yaml and config/theme.yaml
  • Keyboard Consistency: Toolbar actions dispatch to the same handlers as keyboard shortcuts

Multi-Destination Sync [REQ-NSYNC_MULTI_TARGET] - Panorama's Signature Feature

The Core Value: See all destinations while syncing. Mark files in one pane, press Shift+C, and watch them copy to every other visible pane simultaneously. No switching between destinations, no uncertainty about what went where.

How It Works:

  1. Open multiple panes – Your source + all destinations (e.g., source drive + 3 backup drives = 4 panes)
  2. Mark files in the source pane (Space key to mark each file, or Shift+M for all)
  3. Press Shift+C (Copy to All Panes) or Shift+V (Move to All Panes)
  4. Confirm once – Dialog shows exactly which panes will receive the files
  5. Visual verification – Watch files appear in all destination panes; color-coded comparison confirms success

Key Features:

  • Copy to All Panes / Move to All Panes – Sync files from the focused pane to all other visible panes in one action (Shift+C, Shift+V)
  • Parallel Sync – Multi-destination orchestration with parallel copy per source and observer pattern for progress
  • Safe Move Semantics [REQ-MOVE_SEMANTICS] – Source files deleted only after ALL destinations succeed; partial failure leaves source intact
  • Smart Skip [REQ-COMPARE_METHODS] – Skip unchanged files via none, size, mtime, size-mtime, or hash (default: size-mtime)
  • Hash Verification [REQ-HASH_COMPUTATION] – BLAKE3, SHA-256, and XXH3 with streaming for large files; optional post-copy verification
  • Destination Verification [REQ-VERIFY_DEST] – Optional recompute of destination hash after copy to detect corruption
  • Store Failure Detection [REQ-STORE_FAILURE_DETECT] – Error streak tracking per destination; sync aborts when a store is marked unavailable (e.g., ejected USB drive)

Why This Matters:

  • Speed: One operation syncs to N destinations (not N separate operations)
  • Safety: Move deletes source only after ALL destinations succeed
  • Confidence: Visual comparison confirms every file reached every destination
  • Efficiency: Skips files that are already up-to-date using fast comparisons

Configuration System

  • YAML Configuration – All file manager settings (keybindings, layout, columns, toolbars, startup paths) in config/files.yaml
  • Theme Customization – Colors, fonts, spacing, and per-element class overrides in config/theme.yaml
  • Configurable Columns [IMPL-FILE_COLUMN_CONFIG] – Show/hide columns (name, size, mtime) and format time display (age or absolute)
  • File Type Icons – Configurable icons and colors for different file types (code, images, archives, documents, etc.)

Technical Stack

  • Next.js 16.1 with App Router and React Server Components
  • React 19.2 with modern concurrent features
  • TypeScript 5.x with strict mode for type safety
  • Tailwind CSS v4 with mobile-first responsive design
  • Dark Mode with automatic system preference detection
  • Optimized Fonts using next/font with Geist Sans and Geist Mono
  • TIED documentation with full requirements traceability (tied/)
  • Comprehensive Testing with Vitest and React Testing Library (576 tests passing)

Quick Start

Installation

  1. Clone the repository:

    git clone <repository-url>
    cd panorama
  2. Install dependencies:

    npm install
  3. Start the development server:

    npm run dev
  4. Open the file manager:

    • Navigate to http://localhost:3000 (redirects to /files)
    • The file manager opens with your home directory in 3-pane mode (use the Layout toolbar to add or remove panes; 1 pane minimum, no upper limit)

Screenshots & Product Tour

Panorama ships committed README demo assets under docs/screenshots/, regenerated by npm run demo:screenshots ([REQ-README_DEMO_AUTOMATION]). Demos use /tmp/test-dirs/{alpha,beta,gamma} (see scripts/setup_readme_screenshots.sh) or ephemeral mesh depot dirs for Mesh routes.

Files page / Workspace (/files)

The Workspace is the multi-pane client shell: a workspace header banner (status row, loaded mesh name, diff control), cross-surface nav to Mesh, workspace area with pane listings in tabular file row layout, and three toolbar tiers (workspace, pane, system). Toggle toolbar compact mode β†’ toolbar expanded mode (keystroke badges) β†’ toolbar named mode (visible Action labels) via the compact toggle.

Workspace shell β€” Full-page 3-pane default layout with header, workspace area, and three toolbar tiers.

Workspace shell β€” 3-pane default

Cross-surface nav β€” Open Mesh and File Manager links open the other surface in a new tab.

Cross-surface nav

Pane listing β€” Tabular file row grid with name, size, and mtime columns.

Pane listing

Toolbar compact β€” Default merged icon row for maximum density.

Toolbar compact

Toolbar expanded β€” Three tiers with keystroke badges on each action.

Toolbar expanded

Toolbar named β€” Three tiers with visible Action labels (no keystroke badges).

Toolbar named

Per-pane filter controls

Each pane in the workspace applies two distinct filter stages to its listing pipeline. Display spec runs first (glob include/exclude on the raw directory listing). Cross-pane visibility runs second on the focused pane, with mirrored visibility in other panes (tri-state compare criteria on the comparison index). Every pane keeps its own active display spec (activeDisplaySpecId) and active cross-pane visibility preset (activeCrossPaneVisibilityId) independently β€” pane 0, 1, and 2 can each show different selector values and indicator lines.

flowchart LR
  rawListing[Raw directory listing]
  displaySpec[Display spec layer per pane]
  crossPane[Cross-pane visibility on focused pane]
  mirror[Mirrored visibility in other panes]
  rawListing --> displaySpec --> crossPane --> mirror
Loading

Per-pane filter controls β€” Three panes with distinct active display specs and cross-pane visibility presets.

Per-pane filter controls

Focused pane filter header β€” Display spec and cross-pane visibility selectors with Filter/Compare indicators.

Focused pane filter header

Layer 1 β€” Display spec (glob filter; see pane-display-filter vocabulary):

Control Component Action
Pane-header spec selector DisplaySpecSelector (pane-display-spec-selector) Choose No filter or an active display spec from the spec catalog
Manage display specs… Workspace toolbar view.displaySpec or selector option Manage specs… Opens DisplaySpecManagerDialog for spec catalog CRUD (include/exclude glob rules)

Layer 2 β€” Cross-pane visibility (compare filter; see cross-pane visibility vocabulary):

Control Component Action
Pane-header preset selector CrossPaneVisibilitySelector (pane-cross-pane-visibility-selector) Choose No compare filter or an active cross-pane visibility preset from the visibility catalog
Manage compare filters… Selector option Manage compare filters… Opens CrossPaneVisibilityManagerDialog for visibility catalog CRUD
Toolbar tri-state buttons view.compareFilter.* Edit the visibility draft on the focused pane (tri-state toggle per criterion)
Compare filter thresholds view.compareFilter.thresholds (or threshold criteria without a set value) Opens compare filter thresholds dialog for size/time inputs

Cross-pane visibility manager β€” Manage compare filters… β€” visibility catalog overview.

Cross-pane visibility manager

Compare filter thresholds β€” Size/time threshold inputs for compare filters.

Compare filter thresholds

Constructing the two pane filters

Every pane (file-manager panel) exposes the same two header controls. Construction happens in shared catalog dialogs; activation is per pane via the selectors above.

Filter 1 β€” Build a display spec (glob spec catalog):

flowchart TD
  openManager[Open DisplaySpecManagerDialog]
  newOrSelect["+ New spec or select catalog entry"]
  editRules[Name description and filter rules]
  saveSpec[Save to spec catalog]
  applyPane[Pane header spec selector on each pane]
  openManager --> newOrSelect --> editRules --> saveSpec --> applyPane
Loading
  1. On any pane, open Manage display specs… (workspace toolbar view.displaySpec or Manage specs… in the pane-header spec selector).
  2. Click + New spec (or From preset… for a starter rule set), or select an existing entry in the catalog list.
  3. Set name and description, then add filter rules in the rule editor: include/exclude Γ— file/directory/both Γ— glob pattern.
  4. Save β€” the spec is stored in the spec catalog (panorama.displaySpecs.v1).
  5. On each pane independently, choose that spec in the spec selector or No filter.

Display spec manager β€” Manage display specs… β€” spec catalog overview (list of saved specs).

Display spec manager

Display spec construct β€” DisplaySpecManagerDialog with filter rules editor (constructing a spec).

Display spec construct

Filter 2 β€” Build a cross-pane visibility preset (visibility catalog):

flowchart TD
  compareOn[Enable comparison mode]
  draftToolbar[Toolbar tri-state toggles on focused pane]
  thresholds[Compare filter thresholds when needed]
  openPresetMgr[Open CrossPaneVisibilityManagerDialog]
  newFromDraft["+ New from focused draft or edit preset"]
  savePreset[Save to visibility catalog]
  applyPane[Pane header preset selector per pane]
  compareOn --> draftToolbar --> thresholds
  draftToolbar --> openPresetMgr --> newFromDraft --> savePreset --> applyPane
Loading
  1. Enable comparison mode (required for the comparison index).
  2. On the focused pane, click toolbar view.compareFilter.* buttons to build a visibility draft (tri-state toggle: inactive β†’ include β†’ exclude per criterion).
  3. When a threshold criterion needs a value, use the compare filter thresholds dialog (see image above).
  4. Open Manage compare filters… β€” click + New from focused draft to snapshot the draft into a named preset, or select an existing preset and edit name/description, then Save. The helper text explains that save copies tri-state toggles and thresholds from the focused pane toolbar.
  5. On each pane, pick the preset in the preset selector or No compare filter.

Compare filter preset manager β€” Manage compare filters… β€” visibility catalog overview.

Compare filter preset manager

Compare filter preset construct β€” CrossPaneVisibilityManagerDialog + New from focused draft (saving toolbar draft to catalog).

Compare filter preset construct

The amber indicator under each pane header shows Filter: {name} when a display spec is active (optional Hidden: N count) and Compare: {name} or Draft when cross-pane visibility is active. The motion GIF cross-pane-visibility-demo.gif demonstrates toolbar tri-state toggle editing of the visibility draft; it complements β€” but does not replace β€” pane-header preset selection.

Motion workflows (GIFs where movement clarifies behavior):

Multi-target sync β€” Mark files β†’ Copy to all panes β†’ confirm β†’ files appear in every destination.

Multi-target sync

Linked mode β€” Linked directory navigation keeps equivalent paths aligned across panes.

Linked mode

Comparison cycle β€” Comparison mode cycles off β†’ name β†’ size β†’ time coloring.

Comparison cycle

Cross-pane visibility β€” Toolbar tri-state toggle buttons edit the visibility draft on the focused pane (complements pane-header preset selectors).

Cross-pane visibility

Pane management β€” Layout picker, add/swap panes, and pane order dialog.

Pane management

3-pane comparison β€” Comparison mode coloring (static snapshot across three panes).

3-pane comparison

Dialogs, pop-overs, and menus

File actions

File context menu β€” Unified right-click menu: copy/move/delete, Touch…, Execute…, Make directory…, Rename Regex…, Set as Base directory, column clipboard.

File context menu

Set base directory β€” Choose which pane(s) receive a new base path.

Set base directory

Touch file β€” Adjust mtime (now, specified, earliest, latest).

Touch file

Execute file β€” Run a shell command against marked files.

Execute file

Make directory β€” Create a folder in this pane or all panes.

Make directory

Rename Regex β€” Bulk rename with match/replacement patterns.

Rename Regex

Layout and columns

Pane order β€” Reorder panes in the workspace layout.

Pane order

Column order β€” Show/hide and reorder file columns.

Column order

Layout picker β€” Tile, One Row, One Column, or Fullscreen layout.

Layout picker

Display and compare filters

Display spec manager β€” Manage display specs… β€” spec catalog overview (list of saved specs).

Display spec manager

Display spec construct β€” DisplaySpecManagerDialog with filter rules editor (constructing a spec).

Display spec construct

Cross-pane visibility manager β€” Manage compare filters… β€” visibility catalog overview.

Cross-pane visibility manager

Cross-pane visibility construct β€” CrossPaneVisibilityManagerDialog + New from focused draft (saving toolbar draft to catalog).

Cross-pane visibility construct

Compare filter thresholds β€” Size/time threshold inputs for compare filters.

Compare filter thresholds

Mesh save and diff

Save workspace as mesh (create) β€” Save pane paths and layout as a new mesh workspace snapshot.

Save workspace as mesh (create)

Save workspace as mesh (update) β€” Update an loaded mesh after layout or path changes.

Save workspace as mesh (update)

Workspace diff β€” Drift table when restored workspace differs from mesh snapshot.

Workspace diff

Mesh GUI (/mesh, /mesh/:meshId/**)

The Mesh hub lists sortable meshes; mesh detail routes cover topology, plan approval, Sync Now, per-mesh depots, export, schedule, and archive. When a workspace snapshot is present, the overview shows a workspace snapshot summary.

Mesh list (/mesh) β€” Sortable columns (name, status, depots, note, updated).

Mesh list

Mesh detail overview β€” Depots, links, and workspace snapshot summary after save.

Mesh detail overview

Topology β€” Fan-out graph of depots and sync links.

Topology

Plan approval β€” Generated change set with approve/discard controls.

Plan approval

Sync session β€” Active session view with Start Sync.

Sync session

Per-mesh depots β€” Depot CRUD for one mesh.

Per-mesh depots

Export β€” Per-mesh export bundle.

Export

Schedule β€” Interval enable/disable for scheduled sync.

Schedule

Archive settings β€” Archive mesh controls.

Archive settings

Open workspace from mesh β€” Cross-surface restore link back to /files.

Open workspace from mesh

Workspace ↔ Mesh bridge

Save a workspace snapshot from /files (Ctrl+Shift+M) to capture pane paths and layout on a mesh. Restore via Open workspace from mesh or ?meshId= β€” the workspace header status row shows the loaded mesh name. After local changes, the workspace diff dialog lists drift; save again in update mode to reconcile.

Workspace header with loaded mesh β€” Status row showing loaded mesh name after restore from Mesh.

Workspace header with loaded mesh

Automated Demo Recording

All assets above are produced by fully automated Playwright tests β€” no manual clicking.

One command:

npm run demo:screenshots

This command:

  1. Seeds comparison and CopyAll fixtures under /tmp/test-dirs/
  2. Starts the dev server on the Playwright port
  3. Runs seven E2E specs (workspace surfaces, pane filters, dialogs, motion GIFs, mesh routes, mesh bridge, CopyAll)
  4. Converts five motion webms to GIFs (scripts/convert_all_readme_gifs.sh)
  5. Verifies the full asset manifest (scripts/verify_demo_screenshots.sh)

npm run demo:record is an alias for the same command.

Individual commands:

echo_exec npm run demo:setup-readme   # Comparison fixture only
echo_exec npm run demo:setup          # CopyAll fixture only
echo_exec npm run test:e2e            # All E2E tests (headless)
echo_exec npm run demo:convert        # Convert recorded webms to GIFs
echo_exec npm run demo:verify         # Check docs/screenshots manifest
echo_exec npm run test:e2e:headed     # Visible browser (debugging)

See docs/screenshots/README.md for the full asset catalog.

URL Deep Linking

New Feature: Pre-configure panes via URL query parameters for instant setup:

http://localhost:3000/files?pane0=/path1&pane1=/path2&pane2=/path3

Example:

npm run dev
open "http://localhost:3000/files?pane0=/tmp/test-dirs/alpha&pane1=/tmp/test-dirs/beta&pane2=/tmp/test-dirs/gamma"

Panes instantly load with the specified directoriesβ€”perfect for:

  • Bookmarkable workflows: Save complex multi-pane setups as browser bookmarks
  • Testing: E2E tests use URL params to set up scenarios instantly (no UI navigation)
  • Documentation: Share exact file manager states via shareable links
  • Reproducibility: Demo scripts can create consistent starting states

Keyboard Shortcuts

The file manager is keyboard-driven for efficiency:

Navigation

  • ↑/↓ or k/j – Move cursor up/down
  • Enter – Enter directory or open file
  • Backspace – Navigate to parent directory
  • Tab – Switch to next pane
  • H – Navigate to home directory
  • B – Show bookmarks dialog
  • [ / ] – Navigate back/forward in history

File Operations

  • Space – Mark file under cursor (and move down)
  • M – Toggle mark on current file
  • Shift+M – Mark all files
  • U – Clear all marks
  • C – Copy marked files
  • V – Move marked files
  • D – Delete marked files
  • R – Rename file under cursor
  • Shift+C – Copy marked files to all other panes
  • Shift+V – Move marked files to all other panes

View & Sort

  • S – Show sort dialog
  • = – Toggle comparison mode
  • . – Toggle hidden files
  • L – Toggle linked navigation mode
  • Ctrl+R – Refresh current pane
  • Shift+R – Refresh all panes

Search & Help

  • / – Finder dialog (quick file filter)
  • Ctrl+F – Content search dialog
  • P – Command palette
  • ? – Show keyboard shortcuts help

Customization

File Manager Configuration (config/files.yaml)

layout:
  default: "tile"              # tile | oneRow | oneColumn | fullscreen
  defaultPaneCount: 3          # Number of panes on startup (3 recommended)
  allowPaneManagement: true    # Allow adding/removing panes
  maxPanes: 0                  # 0 = no upper limit; set a number to cap panes
  defaultLinkedMode: true      # Start with linked navigation enabled

startup:
  mode: "home"                 # home | configured | last
  paths:                       # Startup paths when mode = "configured"
    pane1: "~"
    pane2: "~/Documents"
    pane3: "~/Downloads"
  rememberLastLocations: false # Remember last visited directories

columns:                       # Visible columns and their format
  - id: mtime
    visible: true
    format: "age"              # "age" for relative time, "absolute" for YYYY-MM-DD HH:MM:SS
  - id: size
    visible: true
  - id: name
    visible: true

Theme Configuration (config/theme.yaml)

colors:
  light:
    background: "#ffffff"
    foreground: "#171717"
  dark:
    background: "#0a0a0a"
    foreground: "#ededed"

files:
  overrides:                   # Per-element class overrides
    paneContainer: ""
    paneFocused: ""
    fileRow: ""
    fileCursor: ""
  compareColors:               # File comparison colors
    same: "bg-zinc-100 dark:bg-zinc-800"
    different: "bg-red-100 dark:bg-red-900"
    unique: "bg-yellow-100 dark:bg-yellow-900"
  fileTypes:                   # File type icons and colors
    code:
      icon: "πŸ’»"
      iconClass: "text-purple-500 dark:text-purple-400"
      patterns: ["*.ts", "*.tsx", "*.js", "*.jsx", "*.py", "*.go"]
    image:
      icon: "πŸ–ΌοΈ"
      iconClass: "text-green-500 dark:text-green-400"
      patterns: ["*.jpg", "*.png", "*.gif", "*.webp"]

Prerequisites

  • Node.js: v18.17 or later (LTS recommended)
  • npm: v9.x or later (comes with Node.js)

Check your versions:

node --version  # Should be v18.17+
npm --version   # Should be v9.x+

Development Workflow

Testing

Run all tests:

npm test

Run tests in watch mode (recommended during development):

npm run test:watch

Generate coverage report:

npm run test:coverage

Current Status: 576 tests passing, 3 skipped

Linting

Run ESLint to check code quality:

npm run lint

Fix auto-fixable issues:

npm run lint -- --fix

Building for Production

Create an optimized production build:

npm run build

Start the production server:

npm start

The production server runs at http://localhost:3000

Project Structure

nx1/
β”œβ”€β”€ config/                        # YAML configuration files
β”‚   β”œβ”€β”€ site.yaml                 # Site metadata (minimal for file manager)
β”‚   β”œβ”€β”€ theme.yaml                # Colors, fonts, spacing, file manager theme
β”‚   └── files.yaml                # File manager configuration
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                       # Next.js App Router
β”‚   β”‚   β”œβ”€β”€ layout.tsx            # Root layout [IMPL-ROOT_LAYOUT]
β”‚   β”‚   β”œβ”€β”€ page.tsx              # Redirects to /files [IMPL-FILE_MANAGER_PAGE]
β”‚   β”‚   β”œβ”€β”€ globals.css           # Global styles [IMPL-DARK_MODE]
β”‚   β”‚   β”œβ”€β”€ files/                # File manager pages
β”‚   β”‚   β”‚   β”œβ”€β”€ page.tsx          # File manager server page
β”‚   β”‚   β”‚   β”œβ”€β”€ WorkspaceView.tsx # Multi-pane workspace (client)
β”‚   β”‚   β”‚   └── components/       # File manager components
β”‚   β”‚   β”‚       β”œβ”€β”€ FilePane.tsx  # Single pane display
β”‚   β”‚   β”‚       β”œβ”€β”€ Toolbar.tsx   # Toolbar system
β”‚   β”‚   β”‚       β”œβ”€β”€ CommandPalette.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ SearchDialog.tsx
β”‚   β”‚   β”‚       └── ... (other dialogs)
β”‚   β”‚   └── api/                  # API routes
β”‚   β”‚       └── files/            # File operations API
β”‚   β”‚           β”œβ”€β”€ route.ts      # List, copy, move, delete, sync
β”‚   β”‚           β”œβ”€β”€ info/route.ts
β”‚   β”‚           β”œβ”€β”€ preview/route.ts
β”‚   β”‚           └── search/route.ts
β”‚   β”œβ”€β”€ lib/                       # Shared modules
β”‚   β”‚   β”œβ”€β”€ config.ts             # Config loader [IMPL-CONFIG_LOADER]
β”‚   β”‚   β”œβ”€β”€ config.types.ts       # Configuration TypeScript interfaces
β”‚   β”‚   β”œβ”€β”€ files.*.ts            # File manager modules
β”‚   β”‚   β”‚   β”œβ”€β”€ files.data.ts     # File operations
β”‚   β”‚   β”‚   β”œβ”€β”€ files.types.ts    # TypeScript types
β”‚   β”‚   β”‚   β”œβ”€β”€ files.utils.ts    # Utilities
β”‚   β”‚   β”‚   β”œβ”€β”€ files.keybinds.ts # Keybinding system
β”‚   β”‚   β”‚   β”œβ”€β”€ files.layout.ts   # Layout calculation
β”‚   β”‚   β”‚   β”œβ”€β”€ files.history.ts  # Directory history
β”‚   β”‚   β”‚   β”œβ”€β”€ files.bookmarks.ts # Bookmarks
β”‚   β”‚   β”‚   β”œβ”€β”€ files.search.ts   # Content search
β”‚   β”‚   β”‚   └── files.comparison.ts # File comparison
β”‚   β”‚   β”œβ”€β”€ sync/                 # Multi-destination sync engine
β”‚   β”‚   β”‚   β”œβ”€β”€ engine.ts         # Sync orchestration
β”‚   β”‚   β”‚   β”œβ”€β”€ operations.ts     # File operations
β”‚   β”‚   β”‚   β”œβ”€β”€ compare.ts        # File comparison
β”‚   β”‚   β”‚   β”œβ”€β”€ hash.ts           # Hash computation
β”‚   β”‚   β”‚   β”œβ”€β”€ verify.ts         # Verification
β”‚   β”‚   β”‚   └── store.ts          # Store failure detection
β”‚   β”‚   β”œβ”€β”€ logger.ts             # Logging system
β”‚   β”‚   └── *.test.ts             # Unit tests
β”‚   └── test/                     # Integration tests
β”‚       β”œβ”€β”€ setup.ts              # Test configuration
β”‚       └── integration/
β”‚           └── app.test.tsx      # Application integration tests
β”œβ”€β”€ public/                       # Static assets
β”œβ”€β”€ tied/                         # TIED documentation (project + methodology/)
β”‚   β”œβ”€β”€ requirements.yaml         # Project requirements [REQ-*]
β”‚   β”œβ”€β”€ architecture-decisions.yaml
β”‚   β”œβ”€β”€ implementation-decisions.yaml
β”‚   β”œβ”€β”€ semantic-tokens.yaml
β”‚   β”œβ”€β”€ requirements/             # REQ detail YAML
β”‚   β”œβ”€β”€ architecture-decisions/   # ARCH detail YAML
β”‚   └── implementation-decisions/ # IMPL detail + *-pseudocode.md
β”œβ”€β”€ docs/                         # Additional documentation
β”‚   β”œβ”€β”€ FILE_MANAGER_SOLE_PURPOSE.md # Refactor summary
β”‚   β”œβ”€β”€ GOFUL_TRANSFER_SUMMARY.md # Feature transfer notes
β”‚   └── LOGGING.md                # Logging system docs
β”œβ”€β”€ .gitignore                    # Git ignore rules
β”œβ”€β”€ CHANGELOG.md                  # Version history
β”œβ”€β”€ README.md                     # This file
β”œβ”€β”€ TESTING.md                    # Testing guide
β”œβ”€β”€ AGENTS.md                     # AI agent operating guide (TIED)
β”œβ”€β”€ eslint.config.mjs             # ESLint configuration
β”œβ”€β”€ next.config.ts                # Next.js configuration
β”œβ”€β”€ package.json                  # Dependencies and scripts
β”œβ”€β”€ postcss.config.mjs            # PostCSS configuration
β”œβ”€β”€ tsconfig.json                 # TypeScript configuration
└── vitest.config.ts              # Vitest test configuration

Available Scripts

Script Command Description
dev next dev Start development server with hot reload
build next build Create optimized production build
start next start Serve production build
lint eslint Check code quality and style
test vitest Run tests in CI mode
test:watch vitest --watch Run tests on file changes
test:coverage vitest --coverage Generate coverage report

Deployment

Docker

Build and run:

docker build -t file-manager .
docker run -p 3000:3000 file-manager

Self-Hosted Node.js

  1. Build: npm run build
  2. Upload .next/, public/, config/, package.json
  3. Install production dependencies: npm install --production
  4. Start: npm start
  5. Use PM2 or systemd for process management

TIED Methodology

This project follows TIED 2.2 (see AGENTS.md), creating a traceable chain from requirements to code:

[REQ-*] β†’ [ARCH-*] β†’ [IMPL-*] (essence_pseudocode) β†’ Tests β†’ Code

Documentation

Project records are under tied/ (methodology templates are read-only in tied/methodology/):

For Developers

When adding new features:

  1. Document the requirement with [REQ-*] in tied/requirements.yaml (use tied-cli.sh / TIED MCP)
  2. Record architecture with [ARCH-*]
  3. Author [IMPL-*] with essence_pseudocode in tied/implementation-decisions/IMPL-*-pseudocode.md
  4. Write failing tests, then code, aligned to pseudocode blocks
  5. Run tied_validate_consistency before merging

See AGENTS.md and tied/docs/ai-principles.md for complete guidelines.

Key Features Deep Dive

Multi-Pane Layout

The file manager defaults to 3 panes and supports 1 pane or more with no upper limit. Layout is calculated automatically from available space. Use the Layout toolbar to add or remove panes (pane management can be disabled in config). Panes can be arranged in:

  • Tile – Equal-size grid layout
  • One Row – All panes in a horizontal row
  • One Column – All panes in a vertical column
  • Fullscreen – Single pane uses entire workspace

Linked Navigation Mode

When enabled (L key), all panes navigate together:

  • Entering a directory in one pane navigates all panes to equivalent subdirectories
  • Cursor position syncs across panes (same relative position)
  • Sort settings are synchronized
  • Parent navigation (.. button or Backspace) navigates all panes to their parents
  • Automatically disables if directory structures diverge

Multi-Destination Sync (Panorama's Core Feature)

Inspired by Goful's nsync integration, this is what makes Panorama unique:

The Workflow:

  1. Set up your view: Open panes for your source + all destinations (3-5 panes recommended)
  2. Mark files: Space to mark individual files, Shift+M for all
  3. Sync: Shift+C (copy to all) or Shift+V (move to all)
  4. Verify visually: All panes show the synced files; comparison mode color-codes the results

Why It's Better Than Traditional Approaches:

  • Traditional: Copy to drive 1 β†’ verify β†’ copy to drive 2 β†’ verify β†’ copy to drive 3 β†’ verify (3Γ— the time)
  • Panorama: Mark files once β†’ Shift+C β†’ all 3 drives receive files in parallel β†’ visual confirmation shows all destinations

Technical Advantages:

  • Parallel copy operations for speed (copies to all destinations concurrently per source file)
  • Safe move semantics: source deleted only after ALL destinations succeed (prevents data loss on partial failure)
  • Smart skip: unchanged files detected via size, timestamp, or hash (saves time on incremental syncs)
  • Optional hash verification: recompute hash after copy to detect silent corruption
  • Store failure detection: aborts sync if a destination becomes unavailable (detects ejected USB drives, network failures)

Real-World Example: You have important project files on your laptop and three backup drives (USB, NAS, cloud mount). Traditional workflow: copy to USB, verify, copy to NAS, verify, copy to cloud, verify. Panorama workflow: Open 4 panes (laptop + 3 destinations), mark files in laptop pane, Shift+C, done. Visual comparison confirms all three backups instantly.

Content Search

Full-text search across files with:

  • Regex pattern matching
  • Recursive directory scanning
  • Case-sensitive/insensitive options
  • File pattern filtering (glob syntax)
  • Results grouped by file with line numbers
  • Match highlighting in preview

Browser Support

Modern browsers only:

  • Chrome/Edge: Last 2 versions
  • Firefox: Last 2 versions
  • Safari: Last 2 versions
  • Mobile browsers: iOS Safari 13+, Android Chrome

Troubleshooting

Port 3000 already in use:

npx kill-port 3000
# Or use a different port
npm run dev -- -p 3001

Build fails:

npm run clean
npm run build

Config changes not appearing:

  • Restart the development server
  • Check YAML syntax (indentation matters)
  • Verify file paths: config/files.yaml, config/theme.yaml

License

[Add your license here]

Contributing

Contributions welcome! Please follow TIED (see AGENTS.md):

  1. Fork the repository
  2. Create a feature branch
  3. Document requirement in tied/requirements.yaml via TIED MCP / tied-cli.sh
  4. Implement with semantic token comments
  5. Write tests with [REQ-*] references
  6. Update documentation
  7. Create a Pull Request

Links


Built with Next.js, React, and TIED

Version 0.5.1 β€” Multi-pane file manager with Mesh sync platform

About

A modern multi-pane file manager built with Next.js, React 19, TypeScript, and Tailwind CSS v4, following Semantic Token-Driven Development (STDD) methodology for complete traceability from requirements through implementation.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages