A modern, full-stack journaling application with voice recording capabilities built with TypeScript, React, and Node.js.
- π± Responsive Design - Mobile-first UI that works seamlessly on all devices (3-column post grid on mobile)
- ποΈ Voice Recording - Record audio journal entries directly in the browser
- πΈ Image & Video Support - Upload photos and videos to your journal entries
- π¨ Modern Indian Design - Culturally-inspired terracotta and indigo color theme
- π Dark/Light Mode - Toggle between themes with persistent preference
- π User Authentication - Secure registration and login with JWT
- π€ User Profiles - Customize your display name and manage account settings
- π Password Reset - Secure email-based password recovery
- π Social Features - Follow users, manage followers, and community interactions
- πΎ Persistent Storage - PostgreSQL database with Prisma ORM
- π HTTPS Support - Built-in HTTPS for secure mobile access
- π Rich Journal Entries - Text, audio, images, and videos in a single post
- βΎοΈ Infinite Pagination - Load more posts as you scroll (20 posts per page)
- π― Public/Private Entries - Control visibility of your journal entries
- React 18 with TypeScript
- Vite for fast development and building
- React Router v7 for navigation
- Tailwind CSS v4 for responsive styling
- Vitest and React Testing Library for testing
- MediaRecorder API for audio recording
- Web Audio API for audio level monitoring
- Multer for file upload handling
- Node.js with Express
- TypeScript for type safety
- Prisma ORM for database management
- PostgreSQL database
- JWT for authentication
- bcrypt for password hashing
- Multer for file uploads
- Docker Compose for PostgreSQL
- ts-node-dev for hot reload in development
- Monorepo structure with npm workspaces
- Node.js 22+ and npm
- Docker and Docker Compose (for PostgreSQL)
- Git
-
Clone the repository
git clone https://github.com/yourusername/JournalMe.git cd JournalMe -
Install dependencies
npm install
-
Start PostgreSQL
docker-compose up -d
-
Set up environment variables
Create a
.envfile in the root directory:DATABASE_URL=postgresql://postgres:postgres@localhost:5432/journalme JWT_SECRET=your-secret-key-change-in-production PORT=4000
-
Run database migrations
npx prisma migrate dev
-
Start development servers
# Terminal 1: Backend npm --workspace @journalme/backend run dev # Terminal 2: Frontend npm --workspace @journalme/frontend run dev
-
Open the app
- Frontend: https://localhost:5174
- Backend: http://localhost:4000
JournalMe/
βββ packages/
β βββ backend/ # Express API server
β β βββ src/
β β β βββ routes/ # API routes (auth, users, journals)
β β β βββ middleware/ # Auth & validation
β β β βββ __tests__/ # Backend tests
β β βββ uploads/ # Audio file storage
β βββ frontend/ # React application
β βββ src/
β β βββ components/ # Reusable components (Header, ProfileMenu)
β β βββ pages/ # Route pages (Journal, Profile, Settings)
β β βββ __tests__/ # Frontend tests
β βββ e2e/ # Playwright tests
βββ prisma/ # Database schema & migrations
βββ certs/ # HTTPS certificates (dev)
βββ docker-compose.yml # PostgreSQL container
POST /api/auth/register- Register a new userPOST /api/auth/login- Login with email/passwordPOST /api/auth/forgot-password- Request password reset linkPOST /api/auth/reset-password- Reset password with token
GET /api/users/me- Get current user profile (requires auth)PUT /api/users/profile- Update user profile (requires auth)GET /api/users/search?q=query- Search users by email or name
GET /api/journals?limit=20&skip=0- Get paginated journal entries (requires auth)POST /api/journals- Create a new journal entry with optional media (requires auth)GET /api/journals/:id- Get a specific journal entry (requires auth)DELETE /api/journals/:id- Delete a journal entry (requires auth)
POST /api/follows/:userId- Send follow requestPUT /api/follows/:followId- Accept/reject follow requestDELETE /api/follows/:followId- Unfollow a userGET /api/follows/connections- Get followers and following lists
# Run all tests
npm test
# Run frontend tests
npm --workspace @journalme/frontend test
# Run backend tests
npm --workspace @journalme/backend test
# Run E2E tests
npm --workspace @journalme/frontend run test:e2eTo access the app from mobile devices on your local network:
-
Ensure HTTPS certificates are generated:
mkdir -p certs openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
-
Start the dev servers
-
Note the Network URL from Vite output (e.g.,
https://192.168.x.x:5174) -
Access this URL from your mobile device
-
Accept the self-signed certificate warning
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with modern web technologies
- Inspired by the need for a simple, privacy-focused journaling app
- Audio recording powered by browser native APIs
If you encounter any issues or have questions:
- Open an issue
- Check existing discussions
- AI-powered journal insights
- Multi-device sync
- Journal templates
- Export functionality (PDF, Markdown)
- Tags and categories
- Search functionality
- Journal statistics and analytics
Made with β€οΈ by the JournalMe team