A local-first Story Manager application (Scrivener alternative) built with Tauri v2, React, TypeScript, Tailwind CSS, and SQLite.
- Multi-Project Support: Create and manage multiple stories/worlds independently
- 3-Pane Layout: Chapters sidebar, writing environment, and wiki/lore panel
- Digital Typewriter: Distraction-free writing experience with TipTap editor
- Hierarchical Document Management: Organize chapters into folders and subfolders
- Chapter Versioning: Create and restore snapshots of your writing at any time
- Chapter Synopsis: Add brief summaries to chapters for quick reference
- Advanced Wiki & Lore System: Keep track of characters, locations, and other story elements per project
- Lore Relationships (link lore entries, e.g., "Mentor of")
- Rich Lore Entries with Images
- Lore Templates (Character, Location, Item, Faction, Concept)
- AI Story Assistant System:
- 6 Specialized Personas: The Co-Author, The Ruthless Editor, The Plot Architect, The Lorekeeper, Character Simulator, Brainstorming Partner
- 4-Layer Context System: Builds prompts using Persona Identity, Story World Context, Project Memory, and Style Reference
- Deterministic RAG: Injects relevant Wiki entries based on mentions in the text
- Project Memory System: Save AI insights (plot points, world rules, character traits) as persistent project memories
- Ghostwriter Engine (Style Mimicry): Learns your writing style using dynamic excerpts from your chapters
- AI Image Generation: Generate character portraits, landscapes, and items directly from lore descriptions using Gemini models
- Local-First: All data stored locally in SQLite database
- Auto-Save: Automatic saving with 2-second debounce
- Dark Theme: Modern, clean, and easy on the eyes
- Project Isolation: Each project has its own chapters and lore entries
- Frontend: React 19, TypeScript, Tailwind CSS
- Editor: TipTap (rich text editor)
- Backend: Tauri v2 (Rust)
- Database: SQLite (via @tauri-apps/plugin-sql)
- AI Integration: Gemini API (
gemini-3.1-pro-preview&gemini-3.1-flash-image-preview) - Icons: Lucide React
- Node.js (v18 or higher)
- Rust (latest stable)
- npm or yarn
- Install dependencies:
npm install- Run in development mode:
npm run tauri dev- Build for production:
npm run tauri buildessedeum/
├── src/
│ ├── components/
│ │ ├── Editor.tsx # TipTap editor component
│ │ ├── WikiPanel.tsx # Lore/wiki sidebar
│ │ └── ProjectSelector.tsx # Project management UI
│ ├── lib/
│ │ ├── ai.ts # AI system and RAG implementation
│ │ ├── db.ts # SQLite database service
│ │ ├── imageGen.ts # AI Image generation
│ │ ├── templates.ts # Lore entry templates
│ │ └── utils.ts # Utility functions
│ ├── App.tsx # Main application component
│ ├── main.tsx # Application entry point
│ └── index.css # Global styles (Tailwind)
├── src-tauri/
│ ├── src/
│ │ ├── main.rs # Rust entry point
│ │ └── lib.rs # Tauri application setup
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri configuration
└── package.json # Node dependencies
id: INTEGER PRIMARY KEY AUTOINCREMENTname: TEXT (project/story name)description: TEXT (project description)created_at: TEXT (ISO timestamp)updated_at: TEXT (ISO timestamp)
id: INTEGER PRIMARY KEY AUTOINCREMENTproject_id: INTEGER (foreign key to projects)title: TEXT (chapter/folder title)content: TEXT (chapter content in HTML)synopsis: TEXT (brief summary)sort_order: INTEGER (for ordering chapters)parent_id: INTEGER (for nested folders/documents)type: TEXT ('folder' or 'document')
id: INTEGER PRIMARY KEY AUTOINCREMENTchapter_id: INTEGER (foreign key to chapters)content: TEXT (snapshot content)label: TEXT (snapshot name/reason)created_at: TEXT (ISO timestamp)
id: INTEGER PRIMARY KEY AUTOINCREMENTproject_id: INTEGER (foreign key to projects)title: TEXT (lore entry name)type: TEXT (Character, Location, Item, Faction, Concept)content: TEXT (lore entry content in HTML)image_data: TEXT (base64 image data)
id: INTEGER PRIMARY KEY AUTOINCREMENTproject_id: INTEGER (foreign key to projects)source_id: INTEGER (foreign key to lore)target_id: INTEGER (foreign key to lore)label: TEXT (connection type)
id: INTEGER PRIMARY KEY AUTOINCREMENTproject_id: INTEGER (foreign key to projects)content: TEXT (memory content)type: TEXT (plot_point, world_rule, character_decision, style_note, ai_insight)created_at: TEXT (ISO timestamp)
- On first launch, you'll see the project selector
- Click New Project to create your first story/world
- Enter a project name and optional description
- Click on the project name in the top-left to switch between projects
- Edit or delete projects from the project selector
- Click the + button in the Chapters sidebar to create a new chapter or folder
- Drag and drop items to organize your manuscript hierarchically
- Click on a chapter to select and edit it
- Double-click a chapter title to edit it inline
- Use the Snapshot feature in the editor toolbar to save versions of your chapters
- Delete a chapter by hovering over it and clicking the trash icon
- The center pane provides a distraction-free writing environment
- Use the toolbar for basic formatting (Bold, Italic, Headings)
- Content auto-saves after 2 seconds of inactivity
- Invoke the AI Story Assistant to brainstorm, get editing feedback, or simulate character responses
- Select the appropriate Persona for your needs (Co-Author, Editor, Lorekeeper, Character Simulator, etc.)
- Save useful AI insights to Project Memory so the AI remembers them later
- Click the + button in the Wiki panel to add a new lore entry using predefined templates
- Enter a name and select a type (Character, Location, Faction, etc.)
- Click on a lore entry to edit its content in the main editor
- Upload images or generate them with AI directly from the lore descriptions
- Create Relationships between entries to map out character dynamics and world connections
- The AI automatically reads your lore when you mention these items in your text!
- Ctrl/Cmd + B: Bold
- Ctrl/Cmd + I: Italic
- Ctrl/Cmd + Alt + 1/2/3: Heading levels
MIT
Contributions are welcome! Please feel free to submit a Pull Request.