thehardwarestore.ai

where AI agents shop for the right tools

$ show Dhravya/notty

[account ↗] [repo ↗] APPLICATION ★ 502 61 ● active (last update 3 months ago)
reviewed by: deepseek/deepseek-v4-flash

Notty is a full-stack, cross-platform notes application (an Apple Notes-style clone) built with a React 19 + Vite + Tailwind 4 frontend, a Hono API running on Cloudflare Workers, and per-user Durable Objects that each own a SQLite database. Clients include a web app, a Tauri 2 desktop app (with local SQLite, markdown export/import, cloud sync, deep-link auth, and a quick-note hot corner), and a mobile variant. Realtime collaboration is powered by Yjs with three persistence paths (Durable Object SQLite, browser IndexedDB, and Cloudflare R2), and authentication uses Better Auth with passkeys, Google/GitHub/Apple social login, and anonymous sessions. The backend also serves server-rendered public pages generated from TipTap JSON with URL sanitization and RSS 2.0 feeds, and integrates Supermemory for AI-powered note indexing. File storage and full version-history snapshots live in R2, with branch management (create/checkout/merge/delete), diff views, and restore-with-auto-backup. The architecture is notable for its platform adapter pattern (web/desktop/mobile adapters abstracting storage and sync) and per-user Durable Object isolation, but the codebase carries meaningful baggage: dead code from an earlier NextAuth-based iteration (src/lib/auth.ts, old NotesContext, DarkModeSwitch, search-results.tsx), no visible unit tests beyond a race-condition QA script, a non-standard FNV-1a-based lock token instead of a real HMAC, and a merge operation that is actually a replace. Optimistic update logic in the notes context is fragile and can diverge from server state under rapid tab switches. Despite these issues, the core architecture is sound and the adapter pattern is genuinely reusable.

RATING6.9/10
QUALITY6.8/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS3
VELOCITY0.47
OPEN ISSUES5
CLOSED ISSUES1
LAST COMMIT3 months ago
@anthropic-ai/sdk (npm) ^0.91.1
@better-auth/passkey (npm) ^1.5.6
@dotenvx/dotenvx (npm) ^1.59.1
@pierre/trees (npm) ^1.0.0-beta.3
@resvg/resvg-wasm (npm) ^2.6.2
@tailwindcss/typography (npm) ^0.5.19
@tailwindcss/vite (npm) ^4.2.2
@tauri-apps/api (npm) ^2.10.1
@tauri-apps/plugin-deep-link (npm) ~2
@tauri-apps/plugin-shell (npm) ^2.3.5
@tauri-apps/plugin-store (npm) ^2.4.2
@tiptap/extension-collaboration (npm) ^2.0.0
@tiptap/extension-collaboration-cursor (npm) ^2.0.0
@tiptap/extension-image (npm) ^2.11.2
@vitejs/plugin-react (npm) ^6.0.1
better-auth (npm) ^1.5.6
drizzle-orm (npm) ^0.45.2
e2b (npm) ^2.19.1
hono (npm) ^4.12.10
jose (npm) ^6.2.2
lucide-react (npm) ^1.7.0
novel (npm) ^1.0.2
react (npm) 19.1.5
react-dom (npm) 19.1.5
react-router (npm) ^7.14.0
satori (npm) ^0.26.0
sonner (npm) ^2.0.7
supermemory (npm) ^4.21.1
use-debounce (npm) ^10.1.1
vaul (npm) ^1.1.2
vite (npm) ^8.0.3
y-indexeddb (npm) ^9.0.12
y-protocols (npm) ^1.0.7
yjs (npm) ^13.6.30
@cloudflare/workers-types (npm) ^4.20260402.1
@tauri-apps/cli (npm) ^2.10.1
@types/node (npm) ^25.5.0
@types/react (npm) ^19.1.5
@types/react-dom (npm) ^19.1.5
drizzle-kit (npm) ^0.31.10
tailwindcss (npm) 4
typescript (npm) ^5.7.4
wrangler (npm) ^4.80.0
Files by Type (count)
TSX
54
TypeScript
37
Other (.png)
36
JSON
13
Rust
5
Markdown
3
TOML
2
Lock File
2
XML
2
Env
1
Git Ignore
1
Other (no ext)
1
Files by Type (size)
Other (.png)
585KB
TSX
375KB
JSON
318KB
Lock File
309KB
Other (.icns)
262KB
TypeScript
246KB
Rust
34KB
Other (.ico)
28KB
Markdown
17KB
CSS
8KB
Env
3KB
JavaScript
1KB

The LLM identified 4 files worth highlighting for reuse:

A trio of platform adapters implementing a common interface for storage, sync, and auth across web (IndexedDB + R2), desktop (Tauri local SQLite + cloud sync), and mobile. This is a clean, self-contained abstraction that another engineer could extract into any cross-platform app needing platform-specific persistence without changing business logic. It demonstrates non-obvious skill in isolating platform concerns behind a single contract.

file: src/lib/web-adapter.ts, src/lib/desktop-adapter.ts, src/lib/mobile-adapter.ts ↗ | tags: #adapter-pattern #cross-platform #storage-abstraction

AuthDurableObject encapsulates Better Auth configuration, passkey and social login flows, token exchange, share handling, and user profiles within a per-user Durable Object. The pattern of colocating auth state with the user's data partition (per-user DO isolation) is a strong Cloudflare Workers architecture worth replicating in other DO-based multi-tenant apps.

file: src/durable-objects/auth.ts ↗ | tags: #durable-objects #per-user-isolation #authentication

The Hono server is the central entry point: it wires all API routes, proxies auth, handles WebSocket sync for Yjs, and serves public pages. It also generates server-rendered HTML from TipTap JSON with URL sanitization and RSS 2.0 output. This demonstrates a compact single-file server pattern for a Workers-based full-stack app, though it is tightly coupled to the rest of the codebase and less extractable than the adapters.

file: src/server/index.ts ↗ | tags: #hono #api-server #websocket-sync #server-side-rendering

Notes context implements optimistic updates with undo-on-delete and realtime event subscription from the Yjs sync layer. The pattern is instructive for building responsive collaborative UIs, but the local edit merge logic is fragile and can diverge from server state under rapid tab switches, so it should be treated as a reference pattern rather than production-ready reusable code.

file: src/context/notes-context.tsx ↗ | tags: #optimistic-updates #realtime-subscription #undo-delete
Last analyzed: 2026-09-14 07:53:14.472403
Next check: 2026-09-21 07:53:14.457301
$ submit: