TinkerSet

Desktop/web application for exploring and organizing files through configurable rules and LLM assistance. React+Tauri UI with FastAPI backend for processing and action execution.

Python FastAPI TypeScript React Zustand Tauri Rust Pydantic

Overview

Monorepo combining a React UI (with state managed by Zustand) packaged for desktop with Tauri and a Python FastAPI backend. Allows defining JSON 'jobs' that can be previewed or executed on the file system, and offers natural language prompt interpretation via multiple LLM providers. Includes CLI, HTTP routes, and modular filter and action engines.

Architecture

Folder structure: frontend contains the UI (React + TypeScript + Vite) and Tauri wrapper (src-tauri/). app hosts the FastAPI backend with services/ (llm_service, processor, action_engine, filter_engine), models/ (Job), and cli.py. The app exposes endpoints (e.g. /preview, /execute, /ai/interpret) that the UI or CLI can call; Tauri provides IPC integration for the desktop executable. Centralized configuration in config.py that loads .env. LLM integrations support groq, ollama and openai and are encapsulated in services/llm_service.py.

Frontend Tauri Backend (FastAPI) Services LLM Providers Local File System

Key Technical Decisions

Monorepo to keep frontend (Tauri) and backend (FastAPI) together and facilitate local testing

Tauri + React to offer desktop experience and web development with the same codebase

FastAPI + Pydantic for validation and fast, typed HTTP endpoints

Service-based architecture (services/) to separate llm_service, processor, action_engine and filter_engine

CLI (cli.py) for offline workflows and reproducible tests

Centralize .env loading in config.py for consistency across environments

Enforce typing in frontend (avoid any, use unknown and error helper) for greater safety

Consistent naming standard for LLM providers

Challenges

Secret management in .env (risk of exposing API keys if committed) — requires policies and CI secrets

Tauri adds multi-platform build complexity (Rust toolchain and native dependencies on Windows)

Testing LLM integrations may require external keys or emulation systems for CI

No persistent database in core: in-memory/JSON file operations and jobs require care for concurrency and recovery

Development dependencies (Black, Ruff, pre-commit, pytest) increase local footprint and complicate reproducibility without CI

Trade-offs

Monorepo facilitates UI-backend sync but can increase repository size

Tauri offers native APIs and desktop packaging at the cost of more complex builds and native dependencies

Supporting multiple LLM providers increases flexibility but adds code complexity and credential management overhead

No relational database simplifies initial design but limits audit trails/rollback and makes consistency harder if execution fails

Rewriting frontend errors to use unknown and error helper improves type safety but requires extensive component changes

Resources