Project Root
Frontend Structure (src/)
The React frontend is organized by feature:
Backend Structure (src-tauri/)
The Rust backend is minimal and focused:
Key Files Explained
Frontend Entry Point
src/main.tsx
Root Component
src/App.tsx
Main Editor
src/components/journal/EditableNote.tsx
The heart of Philo’s editing experience:
- Initializes TipTap editor with all extensions
- Handles markdown ↔ JSON conversion
- Debounced auto-save (500ms)
- Image paste/drop handling
- Link click handling (open in browser)
- Custom keyboard shortcuts
- StarterKit (headings, lists, bold, italic, etc.)
- CustomParagraph (markdown-friendly paragraphs)
- Image (inline images)
- Underline
- Placeholder
- Link (with click handling)
- FileHandler (drag-and-drop files)
- Highlight
- Table, TableRow, TableCell, TableHeader
- TaskList, CustomTaskItem
- CustomListKeymap
- ClipboardTextSerializer
- HashtagExtension
- WidgetExtension
- ExcalidrawExtension
Services Layer
src/services/storage.ts
Handles daily note operations:
loadDailyNote(date)- Load note for a specific datesaveDailyNote(note)- Save note to diskgetDailyNotePath(date, vaultPath, folder, pattern)- Compute file path
src/services/library.ts
Manages search and collections:
searchMarkdown(query)- Full-text searchaddToLibrary(widget)- Save widget to librarygetLibrary()- Load saved widgetsremoveFromLibrary(id)- Delete widget
src/services/obsidian.ts
Obsidian vault integration:
detectObsidianSettings(vaultPath)- Auto-detect folder structurebootstrapObsidianVault(vaultPath, options)- Create folders and configscanObsidianVaults(startDir)- Discover vaults on disk
invoke() calls with proper error handling.
Backend Core
src-tauri/src/lib.rs
The Rust backend’s main file (~800+ lines) contains:
-
Platform-specific code
- macOS: Objective-C bindings for window opacity and process naming
-
File I/O commands
read_markdown_file()- Reads UTF-8 text files, returns None if not foundwrite_markdown_file()- Creates parent directories, writes atomically
-
Obsidian integration
detect_obsidian_settings()- Parses.obsidian/config filesbootstrap_obsidian_vault()- Creates folder structure and writes configscan_obsidian_vaults()- Recursively searches for.obsidianfolders
-
Full-text search
search_markdown()- SQLite FTS5 queries with BM25 rankingensure_search_schema()- Creates FTS5 tables if neededindex_markdown_files()- Populates search index- Incremental indexing based on file modification time
-
Utilities
extend_fs_scope()- Dynamically allows file system accesscreate_app_menu()- Builds native menu bar- Path normalization and directory filtering
src-tauri/src/main.rs
Minimal entry point that:
- Sets up Tauri application
- Registers all commands
- Configures plugins (dialog, fs, process, opener, updater)
- Creates menu and window
Additional Directories
Public Assets
public/
Static files served at the root URL:
- Favicon
- Meta images for social sharing
- Any other static assets
Vendor Code
vendor/hyprnote/
Third-party code (TipTap styles and customizations) not available via npm.
Scripts
scripts/
Build automation scripts:
tauri.mjs- Custom Tauri CLI wrapper
Apps
apps/landing/
Separate landing page application (not part of desktop app).
Important Configuration Files
Tauri Configuration
src-tauri/tauri.conf.json
Defines:
- App metadata (name, version, identifier)
- Window properties (size, title bar style)
- Build commands (dev and production)
- Security settings (CSP, asset protocol scope)
- Plugin configuration (updater endpoint)
- Bundle settings (icons, targets)
Package Configuration
package.json
Defines:
- Frontend dependencies (React, TipTap, Tailwind, etc.)
- Dev dependencies (Vite, TypeScript, Tauri CLI, etc.)
- Scripts (dev, build, typecheck, fmt)
- Project metadata (name, version, type: module)
src-tauri/Cargo.toml
Defines:
- Rust dependencies (tauri, serde, rusqlite, etc.)
- Platform-specific dependencies (objc for macOS)
- Library configuration (crate types)
- Package metadata (name, version, edition)
Build Configuration
vite.config.ts
Configures Vite for Tauri development:
- React plugin for JSX
- Fixed ports (1421 for dev server, 1422 for HMR)
- Ignores src-tauri in watch mode
- Disables clear screen to show Rust errors
tsconfig.json
TypeScript compiler options:
- Strict mode enabled
- ES2020 target with DOM types
- Bundler module resolution
- No unused locals/parameters
- React JSX transform
Styling Configuration
tailwind.config.js
Tailwind CSS customization:
- Custom color palette
- Typography plugin for prose styling
- Font family definitions
- Responsive breakpoints
postcss.config.js
PostCSS plugins:
- Tailwind CSS processing
- Autoprefixer for vendor prefixes
File Naming Conventions
Frontend
- Components: PascalCase with
.tsxextension (EditableNote.tsx) - Services: camelCase with
.tsextension (storage.ts) - Hooks: camelCase starting with
use(useCurrentDate.ts) - Types: camelCase with
.tsextension (note.ts) - Styles: PascalCase with
.cssextension matching component name
Backend
- Rust files: snake_case with
.rsextension (lib.rs,main.rs) - Cargo packages: kebab-case in
Cargo.toml
Import Paths
Philo uses relative imports (no path aliases configured):Build Outputs
Development
- Frontend: Served from memory by Vite (no disk output)
- Backend: Compiled to
src-tauri/target/debug/philo
Production
- Frontend: Bundled to
dist/directory - Backend: Compiled to
src-tauri/target/release/philo - App Bundle:
- macOS:
src-tauri/target/release/bundle/macos/Philo.app - Windows:
src-tauri/target/release/bundle/msi/Philo_<version>_x64.msi - Linux:
src-tauri/target/release/bundle/deb/philo_<version>_amd64.deb
- macOS:
Git Ignored Files
Next Steps
- Architecture Overview - Understand how components interact
- Tech Stack - Detailed dependency information
- Development Setup - Set up your development environment