Skip to content

Repository files navigation

Ciphra Logo Ciphra

A zero-knowledge encrypted workspace for your documents, notes, and files.

Release License Website Platform Built with Tauri Support


πŸ“₯ Download Β |Β  ✨ Features Β |Β  πŸ–₯️ Self Host Β |Β  πŸ—οΈ Build Β |Β  πŸ“‚ Structure Β |Β  πŸ’¬ Discord Β |Β  πŸ’– Support


Ciphra App Screenshot

Table of Contents


Overview

Ciphra is a zero-knowledge encrypted desktop application for writing, organizing, and storing your most important information. Built with Tauri v2, every single byte of your data β€” documents, folder names, file names, images, and PDFs β€” is encrypted on your device before it ever leaves to the cloud.

No passwords. No email. No recovery codes sent to a server. Your 12-word BIP39 mnemonic phrase is the only key to your vault. Lose it, and nobody β€” not even the developers β€” can help you recover access. That is the point.

"If we can read it, it isn't really yours."


πŸ“₯ Download

Choose the easiest installation method for your operating system. All manual download files are securely hosted on our Releases page.

πŸͺŸ Windows

Recommended (via Winget): The fastest way to install and keep Ciphra updated on Windows is through the Windows Package Manager. Open your terminal or command prompt and run:

winget install Ciphra.Ciphra

Direct Download: If you prefer a manual installation, download the installer of your choice from the Releases page:

  • Ciphra_x.x.x_x64-setup.exe (Standard NSIS Installer)
  • Ciphra_x.x.x_x64_en-US.msi (Windows MSI Installer)

🐧 Linux

We provide multiple package formats to support your favorite distribution. Grab the latest version from the Releases page:

  • Universal: ciphra_x.x.x_amd64.AppImage (Portable, no installation required)
  • Debian / Ubuntu: ciphra_x.x.x_amd64.deb
  • Fedora / RHEL / openSUSE: ciphra-x.x.x-1.x86_64.rpm

🍎 macOS: Not currently published due to Apple notarization requirements. However, you can easily build from source.


Key Features

πŸ” Zero-Knowledge Security

  • BIP39 12-word mnemonic authentication β€” same standard used by crypto hardware wallets
  • AES-256-GCM encryption for all data: documents, folder names, file names, images, and PDFs
  • Private key lives only in RAM β€” never written to disk, never sent to any server
  • Public key stored on Convex β€” used only to identify your account
  • Refresh the app = session cleared. Your key is gone until you log in again.

πŸ”’ App Lock

  • Optional 6-digit PIN that encrypts your RAM key and stores it locally
  • Inactivity auto-lock β€” configurable: 1 min, 5 min, 30 min, or 1 hour
  • App close = instant lock β€” no data left in memory
  • PIN recovery via 12 words β€” verify your mnemonic to reset your PIN
  • Logout wipes the PIN from storage with a confirmation warning

πŸ“ Folder System

  • Create unlimited folders with custom colors and names
  • Star important folders for quick access in the Starred section
  • Rename, recolor, lock individual folders
  • Recycle bin with 30-day auto-deletion via Convex scheduled crons
  • Grid and List view with sorting by name, date created, and date modified
  • Encrypted folder names β€” Convex never sees what your folders are called

πŸ“„ Rich Text Editor

  • Full-screen TipTap editor β€” no boxes, no borders, just your writing
  • Safe Mode β€” document locked by default to prevent accidental edits, one click to enable editing
  • Zoom control β€” adjust editor zoom from 70% to 150%
  • Slash commands (/) for quick formatting: headings, lists, tables, code blocks, dividers
  • Tables β€” fully resizable, Google Docs style. Add/remove rows and columns, merge and split cells
  • Text alignment β€” left, center, right via dropdown
  • Bold, italic, strikethrough, text color, highlight color
  • Inline image insertion with automatic WebP compression (max 800px width)
  • Code blocks with language selector and one-click copy button
  • Find & Replace β€” Ctrl+F to find, toggle replace mode, replace one or all
  • Focus Mode β€” hides all UI, full immersion writing. Press Escape to exit
  • Auto-save β€” debounced 500ms after every keystroke, encrypted before saving
  • Word count, character count, reading time in the status bar
  • Export as PDF β€” opens print dialog with clean styling
  • Export as Markdown β€” downloads a .md file

πŸ–ΌοΈ File Management

  • Upload images (JPG, PNG, GIF, WebP) and PDFs up to 15MB
  • Files are encrypted before upload β€” Convex storage never sees raw bytes
  • Image thumbnails β€” decrypted and rendered in the grid
  • Full-screen viewer for images and PDFs β€” Escape to close
  • Download decrypted file directly from the viewer
  • Filter by: All, Images, PDFs, Documents
  • Pagination with configurable items per page (5, 10, 20, 30, 50, 100, All)
  • Right-click context menu on any file or document

♻️ Recycle Bin

  • All deleted items go to recycle bin first
  • 30-day countdown shown on each item (color-coded: green β†’ amber β†’ red)
  • Restore any item back to its original location
  • Permanent delete with confirmation modal
  • Empty bin button to wipe everything at once
  • Auto-purge via Convex daily cron job β€” no manual cleanup needed

βš™οΈ Settings

  • Appearance β€” Light/Dark mode toggle with live preview cards
  • Security β€” App Lock toggle, PIN setup, timeout configuration, change PIN
  • Storage β€” Visual storage usage bar with percentage and breakdown
  • Data β€” Delete account Permanently

🎨 UI & Experience

  • Light and Dark mode with smooth transitions
  • Premium glassmorphism design throughout
  • Animated empty states with 3D floating effect
  • Breadcrumb navigation β€” Home β†’ Folder β†’ Document
  • Back button on all inner pages
  • Custom 4px scrollbar that matches the theme
  • Splash screen with animated progress bar

How the Encryption Works

Your 12 Words (BIP39)
        β”‚
        β–Ό
   mnemonicToSeed()           ← @scure/bip39
        β”‚
        β–Ό
   PBKDF2 (100,000 iterations, SHA-256)
        β”‚
        β”œβ”€β”€β–Ί Private Key (AES-256-GCM)  ─── stays in RAM only
        β”‚
        └──► Public Key (SHA-256 hash)  ─── stored in Convex
                                             used as account identifier

When you encrypt any data:
   plaintext + Private Key β†’ AES-256-GCM (random 12-byte IV) β†’ base64 ciphertext
   IV is prepended to ciphertext β†’ single base64 string stored in Convex

When you decrypt:
   base64 β†’ split IV (first 12 bytes) + ciphertext β†’ AES-256-GCM decrypt β†’ plaintext

This happens 100% on your device. Convex only ever sees encrypted base64 strings.

What Convex stores:

  • Encrypted folder names (nameEncrypted)
  • Encrypted document titles (titleEncrypted)
  • Encrypted document content (contentEncrypted)
  • Encrypted file names (nameEncrypted)
  • Encrypted file bytes (uploaded to Convex Storage)
  • Your public key (used only to find your account on login)

What Convex never sees:

  • Your 12 words
  • Your private key
  • Any plaintext content
  • Any readable file data

Tech Stack

Layer Technology
Desktop Shell Tauri v2 (Rust)
Frontend React 18 + TypeScript + Vite
Styling Tailwind CSS v4 + shadcn/ui
Backend / Database Convex (real-time, serverless)
Editor TipTap v3
Encryption Web Crypto API (AES-256-GCM)
Mnemonic @scure/bip39 (BIP39 standard)
State Management Zustand v5
Routing React Router v7
Icons Lucide React
Notifications Sonner
ZIP Export JSZip + FileSaver

πŸ“‚ Folder Structure

A complete and exhaustive breakdown of the Ciphra project architecture, including all frontend features, serverless backend files, native desktop integration, and their specific purposes.

ciphra/
β”œβ”€β”€ .github/
β”‚   β”œβ”€β”€ assets/
β”‚   β”‚   β”œβ”€β”€ app.png                           # App screenshot for README
β”‚   β”‚   └── icon.png                          # App logo
β”‚   └── workflows/
β”‚       └── release.yml                       # GitHub Actions β€” builds all platforms
β”‚
β”œβ”€β”€ convex/                                   # Convex backend (serverless functions)
β”‚   β”œβ”€β”€ _generated/                           # Auto-generated by Convex CLI
β”‚   β”‚   β”œβ”€β”€ api.d.ts                          # TypeScript definitions for API
β”‚   β”‚   β”œβ”€β”€ api.js                            # Compiled API endpoints
β”‚   β”‚   β”œβ”€β”€ dataModel.d.ts                    # Schema data types
β”‚   β”‚   β”œβ”€β”€ server.d.ts                       # Server types
β”‚   β”‚   └── server.js                         # Compiled server code
β”‚   β”œβ”€β”€ auth.ts                               # User create / login / delete
β”‚   β”œβ”€β”€ crons.ts                              # Daily auto-delete scheduled job
β”‚   β”œβ”€β”€ documents.ts                          # Document CRUD + recycle bin
β”‚   β”œβ”€β”€ files.ts                              # File upload / storage / recycle bin
β”‚   β”œβ”€β”€ folders.ts                            # Folder CRUD + recycle bin
β”‚   β”œβ”€β”€ recycleBin.ts                         # Internal purge mutation
β”‚   β”œβ”€β”€ schema.ts                             # Database schema (all tables)
β”‚   β”œβ”€β”€ README.md                             # Convex backend documentation
β”‚   └── tsconfig.json                         # TypeScript config for backend
β”‚
β”œβ”€β”€ src-tauri/                                # Tauri Rust backend
β”‚   β”œβ”€β”€ capabilities/                         # Tauri permission definitions
β”‚   β”‚   └── default.json                      # Default system permissions
β”‚   β”œβ”€β”€ gen/                                  # Auto-generated by Tauri
β”‚   β”‚   └── schemas/                          # IPC and configuration schemas
β”‚   β”‚       β”œβ”€β”€ acl-manifests.json
β”‚   β”‚       β”œβ”€β”€ capabilities.json
β”‚   β”‚       β”œβ”€β”€ desktop-schema.json
β”‚   β”‚       └── windows-schema.json
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ lib.rs                            # Rust library and plugin setup
β”‚   β”‚   └── main.rs                           # Tauri application entry point
β”‚   β”œβ”€β”€ .gitignore                            # Ignored files for Rust backend
β”‚   β”œβ”€β”€ 2                                     # Tauri v2 flag/lock
β”‚   β”œβ”€β”€ build.rs                              # Rust build script
β”‚   β”œβ”€β”€ Cargo.lock                            # Rust dependency lockfile
β”‚   β”œβ”€β”€ Cargo.toml                            # Rust dependencies and versioning
β”‚   └── tauri.conf.json                       # App config, window size, identifier
β”‚
β”œβ”€β”€ src/                                      # React Frontend
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ common/
β”‚   β”‚   β”‚   β”œβ”€β”€ ConfirmModal.tsx              # Generic confirmation dialog
β”‚   β”‚   β”‚   β”œβ”€β”€ EmptyState.tsx                # Animated empty state with 3D icon
β”‚   β”‚   β”‚   β”œβ”€β”€ FullScreenViewer.tsx          # Decrypted image/PDF viewer
β”‚   β”‚   β”‚   β”œβ”€β”€ SearchEmptyState.tsx          # UI for no search results
β”‚   β”‚   β”‚   β”œβ”€β”€ UpdateProgressToast.tsx       # Progress bar for app updates
β”‚   β”‚   β”‚   └── VerifyPinModal.tsx            # PIN verification modal
β”‚   β”‚   β”œβ”€β”€ layout/
β”‚   β”‚   β”‚   β”œβ”€β”€ Breadcrumb.tsx                # Breadcrumb navigation
β”‚   β”‚   β”‚   β”œβ”€β”€ LogoutModal.tsx               # Secure logout confirmation
β”‚   β”‚   β”‚   └── TopNav.tsx                    # Sticky top navbar
β”‚   β”‚   └── ui/                               # shadcn/ui auto-generated components
β”‚   β”‚       β”œβ”€β”€ alert-dialog.tsx              # Alert dialog primitive
β”‚   β”‚       β”œβ”€β”€ badge.tsx                     # Badge primitive
β”‚   β”‚       β”œβ”€β”€ button.tsx                    # Button primitive
β”‚   β”‚       β”œβ”€β”€ card.tsx                      # Card container primitive
β”‚   β”‚       β”œβ”€β”€ checkbox.tsx                  # Checkbox primitive
β”‚   β”‚       β”œβ”€β”€ context-menu.tsx              # Right-click menu primitive
β”‚   β”‚       β”œβ”€β”€ dialog.tsx                    # Modal dialog primitive
β”‚   β”‚       β”œβ”€β”€ dropdown-menu.tsx             # Dropdown primitive
β”‚   β”‚       β”œβ”€β”€ input.tsx                     # Text input primitive
β”‚   β”‚       β”œβ”€β”€ popover.tsx                   # Popover primitive
β”‚   β”‚       β”œβ”€β”€ scroll-area.tsx               # Custom scrollbar container
β”‚   β”‚       β”œβ”€β”€ separator.tsx                 # Divider primitive
β”‚   β”‚       β”œβ”€β”€ sonner.tsx                    # Toast notification system
β”‚   β”‚       β”œβ”€β”€ tabs.tsx                      # Tab navigation primitive
β”‚   β”‚       └── tooltip.tsx                   # Tooltip primitive
β”‚   β”‚
β”‚   β”œβ”€β”€ features/                             # Core App Modules
β”‚   β”‚   β”œβ”€β”€ auth/                             # Authentication Flow
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MnemonicInputGrid.tsx     # Reusable 12-word input grid
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MnemonicRevealStep.tsx    # Step 2 β€” show/copy/download 12 words
β”‚   β”‚   β”‚   β”‚   └── UsernameStep.tsx          # Step 1 β€” username availability check
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   β”‚   └── useLogin.ts               # Login logic + lockout handling
β”‚   β”‚   β”‚   β”œβ”€β”€ LoginPage.tsx                 # 12-word grid login page
β”‚   β”‚   β”‚   └── SignupPage.tsx                # Multi-step signup orchestrator
β”‚   β”‚   β”œβ”€β”€ editor/                           # Rich Text Document Editor
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AlignDropdown.tsx         # Text alignment dropdown
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CodeBlockComponent.tsx    # Custom code block with copy
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ EditorStatusBar.tsx       # Word count + save status
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ EditorToolbar.tsx         # Formatting toolbar + title + nav
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ExportMenu.tsx            # PDF + Markdown export
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FindReplace.tsx           # Find & Replace panel
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FontSizeDropdown.tsx      # Text sizing controls
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ LinkModal.tsx             # Insert hyperlink modal
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ResizableImage.tsx        # Inline image resizing
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ SlashCommand.tsx          # '/' command palette
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TableControls.tsx         # Floating table toolbar
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TextStyleDropdown.tsx     # Headings and font styles
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TipTapEditor.tsx          # TipTap instance + extensions
β”‚   β”‚   β”‚   β”‚   └── ToolbarHelpers.tsx        # Helper functions for editor
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ useAutoSave.ts            # Debounced encrypted auto-save
β”‚   β”‚   β”‚   β”‚   └── useFocusMode.ts           # Focus mode toggle + Escape key
β”‚   β”‚   β”‚   β”œβ”€β”€ styles/
β”‚   β”‚   β”‚   β”‚   └── EditorPage.css            # Editor-specific styles
β”‚   β”‚   β”‚   └── EditorPage.tsx                # Full-screen document editor page
β”‚   β”‚   β”œβ”€β”€ folder/                           # Folder & Vault View
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CreateDocModal.tsx        # New document modal
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FileCard.tsx              # Grid card for file/doc
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FileContextMenu.tsx       # Right-click menu for items
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FileFilter.tsx            # All/Images/PDFs/Documents filter
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FileGrid.tsx              # Unified grid with pagination
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FileListItem.tsx          # List row for file/doc
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FolderActionBar.tsx       # Filter + sort + view + actions
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ImageThumbnail.tsx        # Decrypt + render image thumbnail
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ StarredItemsSection.tsx   # Starred items in folder
β”‚   β”‚   β”‚   β”‚   └── UploadFileModal.tsx       # Encrypted file upload
β”‚   β”‚   β”‚   └── FolderPage.tsx                # Folder contents page
β”‚   β”‚   β”œβ”€β”€ home/                             # Main Dashboard
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CreateFolderModal.tsx     # New folder creation
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FolderCard.tsx            # Grid card for folders
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FolderContextMenu.tsx     # Right-click menu for folders
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FolderGrid.tsx            # Unified folder grid
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ FolderListItem.tsx        # List row for folders
β”‚   β”‚   β”‚   β”‚   └── StarredSection.tsx        # Pinned/Starred folders
β”‚   β”‚   β”‚   └── HomePage.tsx                  # Root page β€” all folders grid
β”‚   β”‚   β”œβ”€β”€ lock/                             # Security & App Lock
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AppLockSettings.tsx       # Enable/disable/change PIN settings
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ PinInput.tsx              # 6-digit PIN input logic
β”‚   β”‚   β”‚   β”‚   └── PinResetModal.tsx         # Reset PIN via 12 words
β”‚   β”‚   β”‚   └── LockScreen.tsx                # PIN entry screen overlay
β”‚   β”‚   β”œβ”€β”€ recycle/                          # Recycle Bin
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ConfirmDeleteModal.tsx    # Permanent delete confirmation
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ RecycleItemCard.tsx       # Grid card for deleted items
β”‚   β”‚   β”‚   β”‚   └── RecycleItemList.tsx       # List row for deleted items
β”‚   β”‚   β”‚   └── RecycleBinPage.tsx            # Recycle bin with grid/list view
β”‚   β”‚   β”œβ”€β”€ settings/                         # App Settings & Preferences
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AboutSettings.tsx         # App info, social links, and updates
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ DataSettings.tsx          # Account deletion and data export
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ SettingsSidebar.tsx       # Collapsible sidebar navigation
β”‚   β”‚   β”‚   β”‚   └── StorageSettings.tsx       # Storage bar + space breakdown
β”‚   β”‚   β”‚   └── SettingsPage.tsx              # Settings layout wrapper
β”‚   β”‚   └── splash/
β”‚   β”‚       └── SplashScreen.tsx              # Splash with animated progress bar
β”‚   β”‚
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── useInactivity.ts                  # Inactivity timer for app lock
β”‚   β”‚
β”‚   β”œβ”€β”€ lib/                                  # Core Logic & Algorithms
β”‚   β”‚   β”œβ”€β”€ crypto/
β”‚   β”‚   β”‚   β”œβ”€β”€ aes.ts                        # AES-256-GCM encrypt / decrypt
β”‚   β”‚   β”‚   β”œβ”€β”€ bip39.ts                      # Mnemonic generate / validate / seed
β”‚   β”‚   β”‚   β”œβ”€β”€ fileCrypto.ts                 # File-specific encryption handling
β”‚   β”‚   β”‚   └── keys.ts                       # Key derivation (PBKDF2 β†’ AES key pair)
β”‚   β”‚   β”œβ”€β”€ storage/
β”‚   β”‚   β”‚   β”œβ”€β”€ pinStorage.ts                 # PIN-encrypted localStorage key storage
β”‚   β”‚   β”‚   └── ram.ts                        # In-memory private key store
β”‚   β”‚   └── utils.ts                          # Tailwind class merge utilities
β”‚   β”‚
β”‚   β”œβ”€β”€ router/
β”‚   β”‚   └── AppRouter.tsx                     # Routes + PrivateRoute guard
β”‚   β”‚
β”‚   β”œβ”€β”€ store/                                # Global State (Zustand)
β”‚   β”‚   β”œβ”€β”€ lockStore.ts                      # App lock state + timeout setting
β”‚   β”‚   β”œβ”€β”€ sessionStore.ts                   # User session (userId, username, publicKey)
β”‚   β”‚   └── themeStore.ts                     # Light/dark mode state
β”‚   β”‚
β”‚   β”œβ”€β”€ App.css                               # Global styles
β”‚   β”œβ”€β”€ App.tsx                               # Root β€” Convex provider, theme, lock
β”‚   β”œβ”€β”€ main.tsx                              # React entry point
β”‚   └── vite-env.d.ts                         # Vite environment types
β”‚
β”œβ”€β”€ .env                                      # Local environment variables
β”œβ”€β”€ .env.local                                # Convex local deployment URL
β”œβ”€β”€ .env.production                           # Convex production deployment URL
β”œβ”€β”€ .gitignore                                # Git ignore rules
β”œβ”€β”€ components.json                           # shadcn/ui configuration
β”œβ”€β”€ convex.json                               # Convex project configuration
β”œβ”€β”€ index.html                                # Main HTML entry point
β”œβ”€β”€ LICENSE                                   # Open source license
β”œβ”€β”€ package-lock.json                         # NPM dependency lockfile
β”œβ”€β”€ package.json                              # NPM dependencies & scripts
β”œβ”€β”€ README.md                                 # Project documentation
β”œβ”€β”€ tsconfig.json                             # TypeScript base configuration
β”œβ”€β”€ tsconfig.node.json                        # Node environment TypeScript config
β”œβ”€β”€ updater.json                              # Tauri auto-updater endpoint configuration
└── vite.config.ts                            # Vite bundler configuration

Self Hosting

You will need:

  • Node.js v20+
  • Rust stable toolchain
  • A free Convex account

Step 1 β€” Clone and install

git clone https://github.com/miangee21/ciphra.git
cd ciphra
npm install

Step 2 β€” Set up Convex (development)

In Terminal 1, start the Convex dev server:

npx convex dev
  • You will be prompted to log in to Convex (browser opens)
  • Select Create a new project, name it ciphra or anything you like
  • Convex automatically creates .env.local in your project root with your dev deployment URL

Step 3 β€” Run the app in development

In Terminal 2, start the Tauri dev build:

npx tauri dev

The app window will open. Create an account, add folders, create documents β€” everything is fully functional in development mode.

Step 4 β€” Deploy Convex to production

  1. Go to your Convex Dashboard
  2. Open your project β†’ click the Production tab
  3. Under Settings, copy these values:
    • Production Deploy Key β€” looks like prod:f...
    • Convex URL β€” looks like https://f***.convex.cloud
  4. Create .env.production in your project root:
VITE_CONVEX_URL="https://f*********************.convex.cloud"

Step 5 β€” Generate signing keys

Tauri requires all distributed builds to be cryptographically signed. Generate your key pair:

npx tauri signer generate

You will be prompted to set a password β€” choose a strong one and save it somewhere safe.

Create .env in your project root:

TAURI_SIGNING_PRIVATE_KEY="your_private_key_here"
TAURI_SIGNING_PRIVATE_KEY_PASSWORD="your_password_here"

Important: Add .env to your .gitignore. Never commit your signing private key to version control.

Environment file summary

File Purpose Created by
.env.local Dev Convex deployment URL Convex CLI (auto-generated in Step 2)
.env.production Production Convex URL You (Step 4)
.env Tauri signing keys You (Step 5)

Building from Source

Prerequisites

  • Node.js v20+
  • Rust stable toolchain β€” run rustup update stable
  • Linux only: install system libraries first:
# Ubuntu / Debian
sudo apt install libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev

# Fedora
sudo dnf install webkit2gtk4.1-devel openssl-devel gtk3-devel libappindicator-gtk3-devel librsvg2-devel

Windows Build

Open PowerShell in the project root. Run these commands in order:

# 1. Deploy Convex schema and functions to production
$env:CONVEX_DEPLOY_KEY="prod:f**********************************"
npx convex deploy

# 2. Set signing key environment variables
$env:TAURI_SIGNING_PRIVATE_KEY="your_private_key_here"
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD="your_password_here"

# 3. Build the app
npx tauri build

Output files (inside src-tauri/target/release/bundle/):

File Description
msi/Ciphra_x.x.x_x64_en-US.msi Windows Installer package
nsis/Ciphra_x.x.x_x64-setup.exe NSIS installer executable

Linux Build

The Convex production deployment only needs to be done once. If you already ran npx convex deploy on Windows, skip that step here.

Open a terminal in the project root:

# 1. Set signing key environment variables
export TAURI_SIGNING_PRIVATE_KEY="your_private_key_here"
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD="your_password_here"

# 2. Build the app
npx tauri build

If you encounter AppImage build errors, use this alternative command:

NO_STRIP=1 APPIMAGE_EXTRACT_AND_RUN=1 npm run tauri build

Output files (inside src-tauri/target/release/bundle/):

File Description
appimage/ciphra_x.x.x_amd64.AppImage Universal Linux portable app
deb/ciphra_x.x.x_amd64.deb Debian / Ubuntu package
rpm/ciphra-x.x.x-1.x86_64.rpm Fedora / openSUSE / RHEL package


Made with ❀️ by Hassan

About

A fully encrypted notes app to create and manage rich documents with images and tables.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Contributors

Languages