Memoiry is a React Native journaling app built with Expo and Gluestack UI, designed to let users record and revisit memories, thoughts, and daily experiences offline. It supports rich text, optional images, local notifications, and intuitive navigation following Google Material Design guidelines.
Clone the repository, install dependencies with npm install, and set up your development environment. Use the following commands to get started:
# Install dependencies
npm install
# Start the app
npx expo startYou can preview the app in:
- Development Build: For testing full device features. See development build.
- Android Emulator: Run the app on a virtual Android device. See Android emulator setup.
- iOS Simulator: Test the app on a simulated iOS device. See iOS simulator setup.
- Expo Go: Quick sandbox for previewing app functionality. See Expo Go.
- Journaling: Create, read, update, and delete journal entries (CRUD).
- Rich Text Editor: Format text and attach optional images.
- Daily Reminders: Set notifications to remind you to journal.
- Offline Support: SQLite-based local data persistence.
- Data Export: Export journal data as a SQLite file for backup.
- Reset Functionality: Clear all data and start fresh.
- Responsive Design: Optimized for various screen sizes.
- Accessible UI: Designed with accessibility in mind.
- React Native + Expo: Managed workflow for cross-platform development.
- Expo Router: File-based navigation for intuitive routing.
- Gluestack UI: Consistent and responsive UI components.
- SQLite: Local database for offline data storage.
- Zustand: Lightweight state management.
- Jest: Unit and snapshot testing.
- TypeScript: Type safety and improved developer experience.
The Memoiry app follows a modular and organized folder structure to ensure maintainability, scalability, and clear separation of concerns.
.
├── README.md # Project overview and setup instructions
├── app # Main source code directory
│ ├── _layout.tsx # Root layout for navigation
│ ├── index.tsx # Home screen
│ ├── profile-setup.tsx # Profile setup screen
│ └── (tabs) # Tab-based navigation
│ ├── _layout.tsx # Tab layout
│ ├── create.tsx # Create journal entry
│ ├── search.tsx # Search journal entries
│ └── user # User-related screens
│ ├── _layout.tsx # User tab layout
│ ├── edit.tsx # Edit user profile
│ └── index.tsx # User options
├── assets # Static assets like images, fonts, icons
├── components # Reusable UI components
│ ├── buttons # Button components
│ ├── cards # Card components
│ ├── form # Form inputs
│ ├── headers # Screen headers
│ ├── navigation # Navigation components
│ └── ui # General UI components
├── configs # App configuration files
├── constants # Global constants used across the app
├── hooks # Custom React hooks
├── locales # Localization files for multiple languages
├── models # SQLite data models
├── scripts # Utility scripts
├── services # Database and business logic services
│ ├── dates.ts # Date utilities
│ ├── file-system.ts # File system operations
│ └── sqlite # SQLite database operations
├── store # Zustand state management stores
├── styles # Global and reusable styles
└── tests # Unit tests
To reset the project and start fresh:
npm run reset-projectThis will clear existing data and reset the app to its initial state.
To export journal data as a SQLite file, use the Export Data option in the user tab. The exported file will be saved locally on your device.
Run unit tests using Jest:
npm test- Expo Documentation – Fundamentals and guides.
- Learn Expo Tutorial – Step-by-step tutorial for Android, iOS, and web.
- SQLite Documentation – Learn more about SQLite.
- Expo GitHub – Explore and contribute.
- Discord Community – Ask questions and chat with developers.