← Back to Documentation

Architecture

Overview

This project is a Personal Operating Environment implemented as a desktop application using the Tauri framework. It functions as a host-level "shell" for launching, managing, and interacting with built-in modules and external plugins. It is NOT a kernel OS — it is a portable layer that runs on top of Windows from an external SSD without installation.

Portable-First Design

Frontend (React + Vite)

Backend (Rust)

Core (src/core)

Commands (src/commands)

Exposes host-level operations to the frontend:

Services (src-tauri/src/services — планируются в Phase 2)

Фоновые воркеры и логика ядра (в текущей версии модуль services пуст, его наполнение запланировано в рамках Phase 2):

Models (src/models)

Strongly-typed serde serializable models:

Database (src-tauri/src/core/storage.rs)

File Organization on Disk

<workspace_root>/          ← active workspace directory (configured in settings)
  .octanium/
    state.sqlite           ← SQLite database (key-value settings, shell state)
    index.db               ← SQLite database (artifact index: items, tags, projects - Phase 2)
    volume.id              ← volume serial for drive letter change detection
    plugins/               ← dynamic plugins loaded for this workspace
      my-tool/
        manifest.json
        index.html
    thumbnails/            ← Cached 256x256 JPEGs of image files
    inbox/                 ← default inbox path
      2026/06/02/
        design-ref.png
        notes.md
    artifacts/             ← default artifact root (overridable)
      AtomX/
        design/
          code/
    backups/

Data Flow: Inbox Drop

User drags file
  → Tauri drag event
  → inbox::receive(paths, mode)
    → determine date from file.created_at
    → copy/move to inbox/YYYY/MM/DD/filename
    → hasher::hash_first_64kb(path)
    → tagger::auto_tag(extension, mime)
    → INSERT INTO items + item_tags
    → FTS5 index update
    → emit event: files_added_to_inbox
  → Frontend: show notification + open Inbox view

Data Flow: Ghost Detection

notify watcher → Remove event for path
  → ghost_detector::on_remove(path)
    → UPDATE items SET status='ghost' WHERE current_path = path
    → emit event: ghost_detected(item_id)
  → Frontend: show ghost notification with [Locate] [Remove] actions

User clicks [Locate]
  → file picker → new_path
  → ghost::relocate_item(id, new_path)
    → verify file exists
    → UPDATE items SET current_path = new_path, status = 'active'
    → FTS5 index update
    → INSERT INTO items_history (action='relocated')
    → emit event: item_relocated