NoteFlow is a full-stack note-taking app for capturing, managing, and refining ideas from a focused mobile interface. It combines an Expo and React Native client with a TypeScript backend, secure authentication, persistent note storage, and AI-powered summaries.
- Authenticates users with Clerk
- Lists notes belonging to the signed-in user
- Creates, reads, edits, and deletes notes
- Displays individual notes in a dedicated detail view
- Queues note-summary requests for background processing
- Generates concise summaries with LangChain and Groq
- Shows summary progress while a background job is queued or processing
- Stores users, notes, and generated summaries in PostgreSQL
- Provides a responsive Expo experience for Android, iOS, and web
Note-App/
|-- mobile/ Expo Router and React Native client
|-- server/ Express API and background worker
|-- docs/gifs/ Product demo assets
|-- docker-compose.dev.yml
`-- docker-compose.prod.yml
The mobile client communicates with the protected notes API. The API validates the authenticated user, handles note operations, and places summarization requests on a BullMQ queue. A separate worker consumes those jobs, calls the Groq model through LangChain, and saves the resulting summary to the note.
- Expo 55 and React Native
- Expo Router with typed routes
- Clerk Expo authentication
- Axios for API communication
- Zod for input and response validation
- TypeScript
- Bun and Express 5
- Clerk Express middleware
- PostgreSQL with Prisma 7
- Redis with BullMQ for background jobs
- LangChain and Groq for AI summarization
- Zod and TypeScript
- A user signs in through Clerk.
- NoteFlow loads the user's notes from the API.
- The user can create, edit, view, or delete a note.
- From the note detail screen, the user can request an AI summary.
- The server queues the request and the worker stores the completed summary.
- The mobile client polls the job status and presents the summary when it is ready.
The server exposes a health endpoint and authenticated note endpoints:
GET /healthGET /notesPOST /notesGET /notes/:noteIdPUT /notes/:noteIdDELETE /notes/:noteIdPOST /notes/:noteId/summarizeGET /notes/:noteId/summarize/:jobId
