July 15, 2026

Pitek — Desktop Asset Manager.

Desktop
Electron Svelte TypeScript Vite Node.js

An Eagle-style desktop asset manager that indexes images, video, audio, and text into tidy, human-readable folders on disk — thumbnails and JSON, no database.

#assetmanager #medialibrary #electron #desktopapp
Pitek — Desktop Asset Manager

Description

Pitek is an Eagle-style desktop asset manager. You create a library, drag in your images, videos, audio, and text files, and Pitek indexes them into a tidy folder structure on disk — every item stored as a thumbnail plus a JSON metadata file, with no database involved.

Unlike Eagle, which stores items in randomly named folders, Pitek keeps everything in flat, human-readable folders you can browse directly in Finder, grouped by the first three letters of each file’s name.

Background

Media libraries that lock your assets behind an opaque database or cryptically named folders make the data hard to trust and hard to recover if the app disappears. Pitek was built around the opposite idea: the folder on disk is the index, and it should stay readable and portable on its own. It is the one project in a series of daily coding experiments built as a real desktop application.

Goal

The goal was a fast, database-free asset manager where the on-disk layout is the single source of truth — human-readable, sortable, and collision-resistant — while still delivering the organizing, filtering, and previewing features expected of a modern media library.

Features

  • Multiple libraries (<name>.pitek) with switching from the sidebar; the last library reopens automatically on launch.
  • Per-library actions: change icon, reveal in Finder, merge into another library, remove, and delete.
  • Importing via drag-and-drop, file picker, recursive folder walk, or from a URL.
  • Link/Reference import that references files in place without copying them, keeping only metadata and a thumbnail.
  • Image thumbnails via sharp, automatic video poster frames, an audio player, and a CodeMirror-based editor with syntax highlighting for text and code.
  • Organizing with multiple folders per item, tags, and smart folders (saved filters).
  • Built-in views: All, Uncategorized, Untagged, Recently Used, Random, and a real Trash.
  • A rich filter bar (type, color, shape, rating, dimensions, duration, size, dates, comment, note, URL) and scoped search.
  • Find duplicates by content hash.
  • Grid layouts (waterfall, justified, grid, list) with a zoom slider and sort options.
  • Inspector with rating, tags, folders, notes/URL, a color palette with coverage percentages, and full metadata.
  • Lightbox preview with rotate, flip, fit/actual size, crop, and next/previous navigation.
  • Automatic migration of older libraries from the previous flat layout on first open.

Technologies

  • Electron with a strict, isolated renderer (contextIsolation, no nodeIntegration)
  • electron-vite build split into main / preload / renderer
  • Svelte 5 and TypeScript for the UI
  • sharp for image thumbnails, palette extraction, and cropping
  • CodeMirror for the text/code editor

How to Run

This is a build-step project that requires Node.js. Run npm install to download Electron and the sharp prebuilt binaries, then npm run dev to launch the app with hot reload. npm run build bundles main, preload, and renderer into out/, and npm run check runs svelte-check type checking.

Technical Decisions

The defining decision was to have no database: each item’s metadata JSON, original file, and thumbnail live together in a folder named after the file’s first three initials, so the filesystem itself is the index. Item IDs combine a name slug with a base36 timestamp and random suffix to stay readable, sortable, and collision-resistant. For security, the renderer is fully isolated and assets are served over a custom asset:// protocol with HTTP Range support for streaming, avoiding file:// and webSecurity workarounds entirely.

What I Learned

Building Pitek was a deep dive into Electron’s process model — cleanly separating filesystem-owning main code from an isolated renderer via a small typed preload bridge. Designing a database-free store that is both human-readable and robust required careful thought about IDs, bucketing, and forward migration, and implementing a custom asset:// protocol with Range support was a practical lesson in secure media streaming inside a desktop app.

Notes

The repository is private, so the source is not publicly browsable. A screenshot or live preview may be added later. As a native desktop app it requires a build step and platform-specific binaries (Electron and sharp), so it cannot run as a static demo in the browser.

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.

Comments