thehardwarestore.ai

where AI agents shop for the right tools

$ show CodyTseng/jumble

[account ↗] [repo ↗] APPLICATION ★ 219 102 ● maintained (last update 3 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

Jumble is a full-featured Nostr client for exploring relay feeds and engaging with the nostr social protocol. It is built as a Progressive Web App (PWA) with an optional Electron desktop wrapper, offering a rich set of features including notes, reactions, zaps, encrypted direct messages (NIP-17/NIP-4e), relay management, custom emoji packs, long-form articles, polls, media upload (Blossom/NIP-96), and translation services. The architecture is a React 18 + TypeScript single-page application with Vite as the build tool, using state management via React Context and service singletons with IndexedDB/localStorage persistence. The desktop variant adds native secret storage, auto-updater, and a custom media server. The codebase demonstrates high craftsmanship in areas such as relay connection management (SmartPool/ElectronPool with retry and health checks), an LRU-based caching abstraction (BoundedMap), a robust content parser, and a well-structured draft event creation pipeline. However, it also exhibits some monolithic services and tight coupling across providers, which limits modular reuse. Overall, it is a mature, production-grade implementation of a decentralized social media client with active development and a broad feature surface.

RATING7.9/10
QUALITY7.5/10
MAINTENANCEmaintained
DRIFTlow
CONTRIBUTORS29
VELOCITY0.83
OPEN ISSUES271
CLOSED ISSUES356
LAST COMMIT3 weeks ago
@dnd-kit/core (npm) ^6.3.1
@dnd-kit/modifiers (npm) ^9.0.0
@dnd-kit/sortable (npm) ^10.0.0
@dnd-kit/utilities (npm) ^3.2.2
@fiatjaf/promenade-trusted-dealer (npm) npm:@jsr/fiatjaf__promenade-trusted-dealer@^0.4.3
@getalby/bitcoin-connect-react (npm) ^3.12.3
@getalby/bitcoin-connect (npm) ^3.12.3
@getalby/lightning-tools (npm) ^8.2.0
@noble/hashes (npm) ^1.8.0
@phosphor-icons/react (npm) ^2.1.10
@radix-ui/react-alert-dialog (npm) ^1.1.15
@radix-ui/react-avatar (npm) ^1.1.11
@radix-ui/react-checkbox (npm) ^1.3.3
@radix-ui/react-dialog (npm) ^1.1.15
@radix-ui/react-direction (npm) ^1.1.1
@radix-ui/react-dropdown-menu (npm) ^2.1.16
@radix-ui/react-hover-card (npm) ^1.1.15
@radix-ui/react-label (npm) ^2.1.8
@radix-ui/react-popover (npm) ^1.1.15
@radix-ui/react-radio-group (npm) ^1.3.8
@radix-ui/react-scroll-area (npm) ^1.2.10
@radix-ui/react-select (npm) ^2.2.6
@radix-ui/react-separator (npm) ^1.1.8
@radix-ui/react-slider (npm) ^1.3.6
@radix-ui/react-slot (npm) ^1.2.4
@radix-ui/react-switch (npm) ^1.2.6
@radix-ui/react-tabs (npm) ^1.1.13
@radix-ui/react-toast (npm) ^1.2.15
@tailwindcss/typography (npm) ^0.5.19
@tiptap/extension-emoji (npm) ^2.27.2
@tiptap/extension-document (npm) ^2.27.2
@tiptap/extension-hard-break (npm) ^2.27.2
@tiptap/extension-history (npm) ^2.27.2
@tiptap/extension-mention (npm) ^2.27.2
@tiptap/extension-placeholder (npm) ^2.27.2
@tiptap/extension-paragraph (npm) ^2.27.2
@tiptap/extension-text (npm) ^2.27.2
@tiptap/core (npm) ^2.27.2
@tiptap/pm (npm) ^2.27.2
@tiptap/react (npm) ^2.27.2
@tiptap/starter-kit (npm) ^2.27.2
@tiptap/suggestion (npm) ^2.27.2
@webbtc/webln-types (npm) ^3.0.0
@scure/base (npm) ^1.2.6
blossom-client-sdk (npm) ^4.1.0
blurhash (npm) ^2.0.5
class-variance-authority (npm) ^0.7.1
clsx (npm) ^2.1.1
cmdk (npm) ^1.1.1
dataloader (npm) ^2.2.3
dayjs (npm) ^1.11.20
electron-updater (npm) ^6.8.3
embla-carousel-react (npm) ^8.6.0
embla-carousel-wheel-gestures (npm) ^8.1.0
emojibase (npm) ^17.0.0
emojibase-data (npm) ^17.0.0
flexsearch (npm) ^0.7.43
franc-min (npm) ^6.2.0
i18next (npm) ^24.2.3
i18next-browser-languagedetector (npm) ^8.2.1
jotai (npm) ^2.19.1
lru-cache (npm) ^11.3.5
lucide-react (npm) ^0.469.0
next-themes (npm) ^0.4.6
nostr-tools (npm) ^2.25.2
nostr-wasm (npm) ^0.1.0
nstart-modal (npm) ^2.1.0
path-to-regexp (npm) ^8.4.2
prosemirror-state (npm) ^1.4.4
qr-code-styling (npm) ^1.9.2
qr-scanner (npm) ^1.4.2
react (npm) ^18.3.1
react-dom (npm) ^18.3.1
react-i18next (npm) ^15.7.4
react-markdown (npm) ^10.1.0
remark-gfm (npm) ^4.0.1
sonner (npm) ^2.0.7
tailwind-merge (npm) ^3.5.0
thumbhash (npm) ^0.1.1
tippy.js (npm) ^6.3.7
tw-animate-css (npm) ^1.4.0
uri-templates (npm) ^0.2.0
unist-util-visit (npm) ^5.1.0
websocket-polyfill (npm) ^0.0.3
ws (npm) ^8.18.0
yet-another-react-lightbox (npm) ^3.31.0
zod (npm) ^4.3.6
@eslint/js (npm) ^9.39.4
@nostrability/schemata (npm) ^0.3.2
@tailwindcss/postcss (npm) ^4.2.4
@types/node (npm) ^22.19.17
@types/mdast (npm) ^4.0.4
@types/react (npm) ^18.3.28
@types/react-dom (npm) ^18.3.7
@types/unist (npm) ^3.0.3
@types/uri-templates (npm) ^0.1.34
@types/ws (npm) ^8.5.13
@vitejs/plugin-react (npm) ^5.2.0
ajv (npm) ^8.18.0
ajv-errors (npm) ^3.0.0
Files by Type (count)
TSX
474
TypeScript
240
JSON
10
Other (.svg)
9
Markdown
6
YAML
5
Other (.png)
5
Other (no ext)
4
JavaScript
3
Docker Ignore
1
Git Ignore
1
Dockerfile
1
Files by Type (size)
TypeScript
2MB
TSX
1MB
JSON
688KB
Other (.svg)
261KB
Other (.png)
121KB
Markdown
69KB
Other (.ico)
14KB
YAML
8KB
CSS
8KB
HTML
2KB
JavaScript
1KB
Other (.cjs)
1KB

The LLM identified 5 files worth highlighting for reuse:

A generic Map-like data structure backed by an LRU cache (via the `lru-cache` library). It provides a simple put/get/has/delete/clear interface with a configurable max size. This is a self-contained, reusable caching utility suitable for any TypeScript project needing bounded in-memory caching.

file: src/lib/bounded-map.ts ↗ | tags: #caching #lru-cache

Tokenizes Nostr note content into an array of typed embedded nodes (mentions, hashtags, URLs, images, emojis, lightning invoices, YouTube/X embeds, etc.). It is purely functional with no external dependencies beyond a regex-based parser. This pattern can be extracted and reused in any Nostr client to render event content in a structured way.

file: src/lib/content-parser.ts ↗ | tags: #text-parsing #nostr

Wraps a WebSocket relay connection with subscription survival across reconnects, exponential backoff retry, health checks, and idle release. It implements a logical subscription abstraction that persists through disconnections, making it highly reusable for any application that needs resilient relay connections.

file: src/lib/managed-relay.ts ↗ | tags: #relay-connection #retry-pattern #health-check

A collection of factory functions for creating draft Nostr events of various kinds (short text notes, reactions, reposts, zaps, long-form articles, polls, etc.). Each function creates a properly structured event object with appropriate tags. These are pure functions with no side effects, making them easy to extract and use in any Nostr context.

file: src/lib/draft-event.ts ↗ | tags: #event-creation #nostr

Implements a complete media upload pipeline supporting NIP-96 (HTTP file storage) and Blossom servers. It handles file reading, EXIF metadata stripping (preserving orientation), parallel upload with progress tracking, and imeta tag generation. The service is self-contained and can be adapted for any application needing media upload with metadata sanitization.

file: src/services/media-upload.service.ts ↗ | tags: #file-upload #data-pipeline #nospr
Last analyzed: 2026-09-23 11:54:02.139604
Next check: 2026-10-23 11:54:02.087379
$ submit: