npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

organizephotos

v0.1.3

Published

A local-first photo library workspace distributed as shadcn source and an npm package.

Readme

OrganizePhotos

Local-first photo organization for React: browse, search, tag, inspect, and export a photo library without uploading the library to a service.

Live demo · Changelog · Library architecture

Why OrganizePhotos

Photo libraries become difficult to use long before they become difficult to store. OrganizePhotos keeps the working library on the device and gives it a workspace built around how people actually look for images: by folder, tag, name, date, and visual context.

It is distributed as both an npm package and installable shadcn source, so you can embed the complete workspace in an existing React application or inspect and adapt the source directly.

What you get

  • Local by default — browser libraries use IndexedDB; directory libraries work against a folder the user explicitly selects through the File System Access API.
  • Useful ways to find images — search by name, folder, or tag; sort by metadata; and switch between grid, list, masonry, adaptive, and day-level timeline layouts.
  • Safe organization — create folders and tags, select images in batches, move items to Trash, and restore them before clearing.
  • Image-library essentials — preview originals, inspect dimensions and capture dates, read EXIF dates for newly imported images, and export selected images as resized or converted ZIP archives.

Supported imported image formats are BMP, JPEG, PNG, and WebP. The workspace is designed for desktop browsers with a viewport of at least 1024px.

Quick start

Install from npm

npm install organizephotos

Render the workspace inside a host that already provides Tailwind CSS and shadcn CSS variables:

import { LibraryWorkspace } from 'organizephotos';
import 'organizephotos/styles.css';
import { Toaster } from 'sonner';

export function App() {
  return (
    <>
      <LibraryWorkspace locale="en" />
      <Toaster />
    </>
  );
}

LibraryWorkspace uses Sonner for operation feedback. If the host already renders a shadcn Sonner/Toaster, reuse that one instead of adding another.

Add as shadcn source

Initialize a Base UI host and add the workspace registry:

npx shadcn@latest init --base base
npx shadcn@latest add https://raw.githubusercontent.com/meetqy/organizephotos/main/registry/library-workspace.json

The registry writes source into the host's configured @/components, @/lib, and @/hooks aliases. Import the generated workspace and keep the host's shadcn variables stylesheet loaded:

import { LibraryWorkspace } from '@/components/library/workspace/workspace';
import '@/styles.css';

export function App() {
  return <LibraryWorkspace />;
}

Configure the workspace

LibraryWorkspace accepts displayMode (full or preview), locale (en or zh), messages for message overrides, theme, and className.

<LibraryWorkspace
  displayMode="preview"
  locale="zh"
  theme={{ mode: 'dark' }}
  className="theme-brand"
/>

The workspace theme is scoped to the library, including dialogs, popovers, menus, and other portal content. theme.variables accepts standard shadcn CSS variables when a host needs a one-off override.

Changelog

See the full changelog for release notes, timeline updates, and performance improvements.

Local data boundary

OrganizePhotos does not require an account, server, upload endpoint, or cloud storage provider. Browser-library images and metadata stay in the current browser's IndexedDB. Directory mode stores metadata in the browser and keeps the original files and portable library index in the folder selected by the user.

Directory mode depends on browser File System Access support and permission. The project does not claim cross-device sync or remote backup.

Learn more

License

OrganizePhotos is released under the GNU Affero General Public License v3.0.