Threshold — Journaling App
A journaling app with auth, image uploads, and a typed asset pipeline. Next.js App Router on Convex for auth + realtime data, deployed to Cloudflare Workers via OpenNext.
A journaling app — capture an entry, attach images, come back later, all behind auth.
Built on Next.js 15 with the App Router and React 19 server components. The backend is Convex: auth, realtime database, and server functions all live inside one runtime, so there’s no second backend to manage and the data model is type-safe end-to-end with the frontend.
Uploads are compressed in the browser with browser-image-compression before leaving the device, so users on slow connections aren’t blocked by the upload itself. A custom build script (scripts/generate-asset-registry.mjs) runs before dev and build to generate a typed registry of every static asset — every image referenced in the app is import-safe and gets caught at build time if a file moves.
Deployed to Cloudflare Workers via @opennextjs/cloudflare, which compiles a Next.js app into the Workers runtime. The choice gives me global edge delivery without a separate Node server.
Tested with Vitest + React Testing Library against a happy-dom environment; backend logic is tested against convex-test (an in-memory Convex runtime).
