Overview
Scratch is organized into three main areas:- Frontend (
src/) - React app with TypeScript and Tailwind CSS - Backend (
src-tauri/) - Rust backend with Tauri v2 - Configuration - Build and release configuration files
Project Root
Frontend Structure (src/)
The frontend is a React 19 app with TypeScript and Tailwind CSS v4.
Components
- Editor.tsx - TipTap editor with auto-save, format bar, slash commands, source mode, focus mode, AI integration
- LinkEditor.tsx - Inline popup for adding/editing/removing links (Cmd+K)
- Sidebar.tsx - Contains note list, search, and git status
- CommandPalette.tsx - Cmd+P interface for quick note navigation and commands
- SettingsPage.tsx - Tabbed settings interface (General, Appearance, Shortcuts, About)
Context Providers
- NotesContext uses dual context pattern (data/actions separated for performance)
- All state management is centralized in contexts (no Redux/Zustand)
- Race condition protection during note switches
Services
Types
Note- Full note with contentNoteMetadata- Note list itemSettings- App settingsGitStatus- Git repository state
Root Files
Backend Structure (src-tauri/)
The backend is written in Rust using Tauri v2.
Source Files
- All Tauri command handlers (40+ commands)
- AppState management (notes cache, file watcher, search index)
- Tantivy search engine integration
- File watcher setup (notify crate)
- Settings persistence
- Preview mode window creation
- CLI argument handling
is_available()- Check if Git is installedget_status()- Get repository statusgit_init()- Initialize repositorycommit_all()- Stage and commitpush()/pull()/fetch()- Remote operationsadd_remote()- Add origin remotepush_with_upstream()- Push with-uflag
Configuration
tauri.conf.json:- App metadata (name, version, identifier)
- Window configuration (size, decorations, transparency)
- Build configuration (targets, signing)
- Plugin configuration (updater, dialog, fs, clipboard)
- Security settings (CSP, capabilities)
- Tauri v2 permissions for plugins
- File system read/write scope
- Dialog permissions
- Clipboard access
- Shell execution (for git commands)
- Asset protocol scope
GitHub Workflows (.github/workflows/)
ci.yml
Runs on every push tomain and on pull requests.
Steps:
- Checkout code
- Setup Node.js and Rust toolchains
- Install dependencies (
npm install) - Run TypeScript compiler (
tsc) - Build frontend (
npm run build) - Check Rust code (
cargo check) - Lint Rust code (
cargo clippy)
release.yml
Runs onv* tag push or manual workflow dispatch.
Platforms:
- macOS (universal binary: arm64 + x86_64)
- Windows (NSIS installer: x64)
- Linux (AppImage + .deb)
- Build and sign apps for all platforms (parallel)
- Upload artifacts to GitHub release (draft)
- Generate
latest.jsonfor auto-updater
- Apple certificates and notarization credentials
- Tauri updater signing key
Configuration Files
package.json
Defines:- Node.js scripts (
dev,build,tauri dev,tauri build) - Frontend dependencies (React, TipTap, Tailwind, Tauri API)
- Dev dependencies (TypeScript, Vite, ESLint)
vite.config.ts
Vite bundler configuration:- React plugin
- Tauri plugin (for development server integration)
- Build optimizations
- Asset handling
tsconfig.json
TypeScript configuration:- Strict type checking enabled
- React JSX transform
- Path aliases
- Module resolution
tailwind.config.js
Tailwind CSS v4 configuration:- Custom color palette
- Dark mode support
- Typography plugin settings
- Custom utilities
Notes Folder Structure
When a user selects a notes folder, Scratch creates this structure:.git/- Git repository.scratch/- App configuration.obsidian/- Obsidian vault data.trash/- Deleted notesassets/- Image files
App Data Directory
Scratch stores global app data in platform-specific locations:- macOS:
~/Library/Application Support/com.erictli.scratch/ - Windows:
%APPDATA%\com.erictli.scratch\ - Linux:
~/.local/share/com.erictli.scratch/
Build Artifacts
Development
Production
Built artifacts are generated insrc-tauri/target/release/bundle/:
- macOS:
.appbundle (code-signed and notarized),.dmginstaller - Windows:
.exeinstaller (NSIS) - Linux:
.AppImage,.deb
latest.json and signature files).
Key Patterns
File Naming
- Components: PascalCase (e.g.,
Editor.tsx,NoteList.tsx) - Utilities: camelCase (e.g.,
utils.ts) - Contexts: PascalCase with
Contextsuffix (e.g.,NotesContext.tsx) - Services: lowercase (e.g.,
notes.ts,git.ts)
Import Organization
- External dependencies (React, Tauri)
- Internal components/contexts
- Services and utilities
- Types
- Styles
Code Organization
- Each component in its own file
- Related components grouped in directories
- Shared UI components in
components/ui/ - Icon components exported from
components/icons/index.tsx - Contexts separated from components
- Tauri command wrappers in services layer
See Also
- Tauri Commands Reference - Complete API reference
- Settings Reference - Settings schema documentation
- CLAUDE.md - Development guide