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

phoneos

v0.0.1

Published

A decentralized mobile-first web operating system powered by Nostr

Readme


Overview

PhoneOS is a collection of standalone Preact + HTM web applications that work together as a cohesive mobile experience. No build step required — everything runs directly in the browser.

Your data. Your keys. Your phone.

  • Decentralized Identity — Sign in with your Nostr keys (NIP-07 browser extension or raw private key)
  • Portable Storage — Data stored on NosDav with DID discovery for custom endpoints
  • Solid Compatible — All data uses JSON-LD format for interoperability
  • Offline First — Service Worker caching with localStorage fallback
  • Zero Build — Pure ESM imports from CDN, works anywhere

Features

| Feature | Description | |---------|-------------| | Android-style Launcher | Home screen with app grid, dock, widgets, and wallpaper customization | | NIP-07/NIP-98 Auth | Seamless authentication via Nostr browser extensions or raw keys | | DID Discovery | Automatic storage endpoint discovery from .well-known/did.json | | PWA Install | Install on any device — Android, iOS, or desktop | | Offline Mode | Full functionality without internet, syncs when back online | | JSON-LD Data | Solid-compatible linked data format for all stored content |

Apps

| App | Description | Storage Path | |-----|-------------|--------------| | Launcher | Android-style home with app grid, dock, widgets | public/startpage/startpage.json | | Bookmarks | Google Bookmarks clone with labels and search | public/bookmark/bookmark.json | | Todo | Task manager with filters, stats, and AI integration | public/todo/todo.json | | Notes | Markdown notes with folders and tags | public/notes/notes.json | | Contacts | Address book with vCard import/export | public/contacts/contacts.json | | Playlists | M3U playlist manager with audio player | public/playlists/playlists.json | | Weather | Forecast using Open-Meteo API | public/weather/weather.json | | Agents | AI agent builder with templates | public/agents/agents.json | | Memory | Memory match card game | public/memory/scores.json |

Installation

As a PWA

Android Chrome:

  1. Visit the deployed site
  2. Tap menu (⋮) → "Install app" or "Add to Home Screen"

iOS Safari:

  1. Visit the deployed site
  2. Tap Share → "Add to Home Screen"

Self-Hosted

# Clone the repository
git clone https://github.com/JavaScriptSolidServer/phoneos.git
cd phoneos

# Serve with any static server
npx serve .
# or
python -m http.server 8000

No build step required — just serve the files.

Architecture

Tech Stack

| Layer | Technology | |-------|------------| | UI | Preact + HTM (ESM from esm.sh) | | Crypto | @noble/secp256k1 for Schnorr signatures | | Storage | NosDav (WebDAV-style with Nostr auth) | | Identity | Nostr keys (NIP-07 / raw private key) | | Offline | Service Worker + localStorage |

Authentication Flow

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│  NIP-07     │────▶│  Sign Event  │────▶│  NIP-98     │
│  Extension  │     │  (kind:27235)│     │  Auth Header│
└─────────────┘     └──────────────┘     └─────────────┘
                            │
                    ┌───────▼───────┐
                    │   nosdav.net  │
                    │   or custom   │
                    │   endpoint    │
                    └───────────────┘

Data Format

All data uses Solid-compatible JSON-LD:

{
  "@context": { "@vocab": "urn:solid:" },
  "@type": "Bookmark",
  "@id": "#bookmark-123",
  "title": "Example",
  "url": "https://example.com",
  "created": "2025-12-06T00:00:00.000Z"
}

Storage Discovery

PhoneOS uses DID discovery to find your storage endpoint:

  1. Check /.well-known/did.json for NosDavStorage or SolidStorage service
  2. Use custom endpoint if found
  3. Fallback to nosdav.net/{pubkey}

Development

Adding a New App

  1. Create newapp.html using existing apps as template
  2. Include StorageConfig and NIP-98 auth code
  3. Use storage path public/newapp/newapp.json
  4. Add to home.html app grid
  5. Add to DEFAULT_APPS in start.html
  6. Add to CORE_ASSETS in sw.js
  7. Bump CACHE_NAME version in sw.js

Project Structure

phoneos/
├── index.html          # Main launcher
├── start.html          # Alternative launcher
├── home.html           # App directory
├── *.html              # Individual apps
├── manifest.json       # PWA manifest
├── sw.js               # Service worker
├── storage-config.js   # Shared storage utilities
├── icons/
│   └── icon.svg        # App icon
└── public/             # User data (JSON-LD)
    ├── todo/
    ├── notes/
    ├── bookmark/
    └── ...

Roadmap

  • [ ] Push notifications via Nostr relays
  • [ ] Background sync for offline changes
  • [ ] App permissions system
  • [ ] Theme customization
  • [ ] Plugin architecture
  • [ ] E2E encryption for private data

Contributing

Contributions are welcome! Please read our contributing guidelines before submitting PRs.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License — see LICENSE for details.