A modern note-taking app with an elegant dark theme
Umbra (Latin for "shadow") β your personal space for thoughts, ideas, and notes in the dark.
- Full CRUD Operations β Create, read, update, and delete notes with ease
- 7 Categories β Personal, Work, Ideas, To-Do, Journal, Study, Other
- 10 Note Colors β Customize your notes with a palette of colors
- 5 Font Options β Choose from Inter, Poppins, Manrope, Merriweather, or System default
- Rich Search β Search notes by title and content instantly
- Category Filtering β Filter and organize notes by category
| Feature | Description |
|---|---|
| π Pin | Pin important notes to the top |
| β Favorite | Mark notes as favorites |
| π¦ Archive | Archive notes you don't need |
| π Lock | Secure notes with biometric authentication (Face ID / Fingerprint) |
- Statistics Overview β Total notes, favorites, pinned items, and word count
- Category Distribution β Visual breakdown of notes per category
- Quick Actions β Fast access to favorites and pinned notes
| Theme | Description |
|---|---|
| Obsidian | Deep black background β the darkest theme |
| Carbon | Sleek dark gray with bright accents |
| Charcoal | Warm dark tone for comfortable reading |
| Slate | Blue-tinged dark for a cooler aesthetic |
- π PDF Export β Export any note to a formatted PDF document
- π Biometric Auth β Lock individual notes with Face ID or fingerprint
- π Notifications β Set reminders for important notes
- π€ Sharing β Share notes directly from the app
| Home Screen | Dashboard | Note Detail | Editor |
|---|---|---|---|
| Browse & search notes | View statistics | Read & manage notes | Create & edit notes |
- Node.js >= 18.x
- npm or yarn
- Expo CLI (
npm install -g expo-cli) - Expo Go app on your mobile device (iOS/Android) for testing
# Clone the repository
git clone https://github.com/IKetutWidiyane/umbra_notes.git
cd umbra-notes
# Install dependencies
npm install
# Start the development server
npm start
# Or launch directly on a specific platform
npm run android
npm run ios
npm run webumbra-notes/
βββ assets/ # Static assets (icons, splash screen)
βββ src/
β βββ components/
β β βββ common/ # Reusable components
β β β βββ CategoryBadge.tsx # Category badge with icon
β β β βββ EmptyState.tsx # Empty state placeholder
β β β βββ FAB.tsx # Floating Action Button
β β β βββ Icon.tsx # Icon wrapper component
β β β βββ LoadingIndicator.tsx # Loading spinner
β β β βββ NoteCard.tsx # Note preview card
β β β βββ SearchBar.tsx # Search input with clear button
β β βββ dashboard/ # Dashboard-specific components
β β β βββ StatsCard.tsx # Statistics card
β β βββ note/ # Note-specific components
β β βββ NoteEditor.tsx # Full note editor
β βββ constants/ # App constants
β β βββ categories.ts # Note categories definition
β β βββ colors.ts # Color palette & themes
β β βββ fonts.ts # Font family configurations
β β βββ themes.ts # Theme management
β βββ database/ # Data layer
β β βββ categoryRepository.ts # Category CRUD operations
β β βββ noteRepository.ts # Note CRUD operations
β β βββ sqlite.ts # SQLite database initialization
β β βββ tagRepository.ts # Tag CRUD operations
β β βββ webDatabase.ts # Web-compatible database fallback
β βββ hooks/ # Custom React hooks
β β βββ useNotes.ts # Note management hook
β β βββ useTheme.ts # Theme management hook
β βββ navigation/ # Navigation configuration
β β βββ AppNavigator.tsx # Bottom tabs & stack navigator
β βββ screens/ # Screen components
β β βββ CreateNoteScreen.tsx # Create new note
β β βββ DashboardScreen.tsx # Statistics dashboard
β β βββ EditNoteScreen.tsx # Edit existing note
β β βββ HomeScreen.tsx # Main notes list
β β βββ NoteDetailScreen.tsx # Note detail view
β βββ services/ # Service layer
β β βββ biometricService.ts # Biometric authentication
β β βββ notificationService.ts # Push & local notifications
β β βββ pdfService.ts # PDF generation & export
β βββ store/ # State management (Zustand)
β β βββ noteStore.ts # Notes state & actions
β β βββ statisticsStore.ts # Statistics state
β β βββ themeStore.ts # Theme state
β βββ types/ # TypeScript type definitions
β β βββ Category.ts # Category type
β β βββ Note.ts # Note type
β β βββ Tag.ts # Tag type
β βββ utils/ # Utility functions
β βββ dateUtils.ts # Date formatting & relative time
β βββ idGenerator.ts # Unique ID generation
β βββ noteUtils.ts # Note filtering & sorting helpers
βββ App.tsx # Application entry point
βββ app.json # Expo configuration
βββ tailwind.config.js # Tailwind CSS / NativeWind config
βββ tsconfig.json # TypeScript configuration
βββ package.json # Dependencies & scripts
| Technology | Purpose |
|---|---|
| React Native (0.74.0) | Cross-platform mobile UI framework |
| Expo (~51.0.0) | Development platform & toolchain |
| TypeScript (5.1.3) | Type-safe JavaScript |
| NativeWind (2.0.11) | Tailwind CSS for React Native |
| Zustand (4.5.0) | Lightweight state management |
| Expo SQLite (~14.0.0) | Local on-device database |
| React Navigation (6.x) | Screen navigation (tabs + stack) |
| React Native Chart Kit | Dashboard statistics visualization |
| React Native Linear Gradient | Smooth gradient effects |
| Expo Local Authentication | Biometric security (Face ID / Fingerprint) |
| Expo Notifications | Local and push notifications |
| Expo Print / Expo Sharing | PDF export and file sharing |
CREATE TABLE notes (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
content TEXT NOT NULL,
category TEXT NOT NULL,
color TEXT NOT NULL,
font TEXT NOT NULL,
pinned INTEGER DEFAULT 0,
favorite INTEGER DEFAULT 0,
archived INTEGER DEFAULT 0,
locked INTEGER DEFAULT 0,
reminder TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);CREATE TABLE tags (
id TEXT PRIMARY KEY,
note_id TEXT NOT NULL,
tag_name TEXT NOT NULL,
FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE CASCADE
);const {
notes, // Note[] β All notes
loading, // boolean β Loading state
error, // string | null β Error message
createNote, // (data: CreateNoteDTO) => Promise<void>
editNote, // (id: string, data: EditNoteDTO) => Promise<void>
removeNote, // (id: string) => Promise<void>
toggleFavorite, // (id: string) => Promise<void>
togglePin, // (id: string) => Promise<void>
toggleArchive, // (id: string) => Promise<void>
searchNotes, // (query: string) => Promise<void>
} = useNotes();const {
colors, // ThemeColors β Current theme color object
setTheme, // (theme: ThemeType) => void
isDark, // boolean β Always true (dark-only app)
} = useTheme();Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the ISC License β see the LICENSE file for details.
- Built with Expo and React Native
- Styled with NativeWind (Tailwind CSS)
- Icons from @expo/vector-icons
- State management by Zustand
Made with β€οΈ by IKetutWidiyane