|
| 1 | +<p align="center"><img width="448" height="560" alt="Codeman, the OpenFall mascot" src="https://github.com/user-attachments/assets/dbeb6553-7a31-4a89-9708-47bed84e3e45" /></p> |
| 2 | + |
| 3 | +<h1 align="center">OpenFall</h1> |
| 4 | + |
| 5 | +<p align="center"><em>An autosaving digital journal and odd-ball file examiner. Your documents are <strong>leaves</strong>, and they never get lost.</em></p> |
| 6 | + |
| 7 | +<p align="center"> |
| 8 | + <img alt="status: alpha" src="https://img.shields.io/badge/status-alpha-e8a33d"> |
| 9 | + <img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-9fb87a"> |
| 10 | + <img alt="platforms" src="https://img.shields.io/badge/platforms-Windows%20%C2%B7%20Linux%20%C2%B7%20Portable-8aa6d6"> |
| 11 | + <img alt="built with" src="https://img.shields.io/badge/built%20with-Electron%20%2B%20React-74b8b8"> |
| 12 | +</p> |
| 13 | + |
| 14 | +OpenFall is a desktop text editor with two ideas at its core: |
| 15 | + |
| 16 | +1. **Autosave everything, always.** Every open document (a *leaf*) is mirrored to disk on an interval. Nothing is lost between sessions; leaves persist across restarts and can be exported to other formats. |
| 17 | +2. **Leaves, not tabs.** Instead of tabs along the top, open documents are **angled bookmark ribbons** that jut from the left and right edges of the window, past a transparent border, tilted up-and-outward like bookmarks fanning out of a book. They **self-name from their first words** and can be double-clicked to rename. |
| 18 | + |
| 19 | +It is also good at *examining* unusual files: code leaves render with syntax highlighting, odd binaries show a hex view, and search results appear as a **Terminal** console or a vertical **List** ("HTML breakdown") tree. |
| 20 | + |
| 21 | +<p align="center"><img alt="OpenFall, the journal" src="docs/screenshots/journal.png" width="820"></p> |
| 22 | + |
| 23 | +## The name |
| 24 | + |
| 25 | +**OpenFall** = **Open** (open source) + **Fall** (the season the leaves turn and let go). It is named for its own *leaves*: the documents that hang off the window like leaves off a branch. Open-source, and a little autumnal. |
| 26 | + |
| 27 | +## Status: alpha |
| 28 | + |
| 29 | +This is an early **alpha**. The core is real and works: autosave, the leaf model, the examiner, search, multi-window, themes, and a sandboxed web leaf, all backed by a unit and integration test suite. Expect rough edges; builds are unsigned, the visual polish is still settling, and APIs may change. Feedback and issues are very welcome. |
| 30 | + |
| 31 | +## Features |
| 32 | + |
| 33 | +- **Signature bookmark leaves:** two rails of tilted ribbons overhanging a transparent window edge; the active leaf juts further with a brass accent. |
| 34 | +- **Autosave** on a configurable interval (10s / 30s / 1min / 5min) to a directory you choose; state survives a full restart. |
| 35 | +- **Self-naming leaves** from their first words; double-click to rename (the name then sticks). |
| 36 | +- **Code examiner:** read-only, syntax-highlighted view for code leaves, with a color legend. |
| 37 | +- **Content-aware highlighting:** a *note* that looks like code gets live, **editable** syntax highlighting (named code files stay a read-only examiner). |
| 38 | +- **Odd-ball file examiner:** paste or open something strange and read it as a hex dump. |
| 39 | +- **Other View:** split the workspace into two independent editor panes. |
| 40 | +- **Separate View / Join View:** pop a leaf into its own window and send leaves between windows, with a shared, synced store. |
| 41 | +- **Search, two ways:** Find and Transform (Search / Replace / Remove / Add, with Match case / Whole word / Regex), shown as a **Terminal** dock or a vertical **List** tree. |
| 42 | +- **Web Quick Search:** a locked-down browser leaf, with a choice of search engine. |
| 43 | +- **Categories**, **Sort**, **Export As** (`.txt .md .html .pdf .json .rtf`), **Dark / Light / System** themes, spellcheck, line numbers, word wrap, and zoom. |
| 44 | + |
| 45 | +### Examine anything |
| 46 | + |
| 47 | +Code leaves get syntax highlighting and a legend; renamed-by-hand binaries reveal themselves in a hex view. |
| 48 | + |
| 49 | +| Code examiner | Odd-ball file examiner | |
| 50 | +|:---:|:---:| |
| 51 | +|  |  | |
| 52 | + |
| 53 | +### Search: Terminal or HTML-breakdown |
| 54 | + |
| 55 | +Run a search across your leaves and read the results the way you like: a **Terminal** console of `path:line:col` hits, or a vertical **List** tree grouped by folder, leaf, and match. |
| 56 | + |
| 57 | +| Terminal | List (HTML breakdown) | |
| 58 | +|:---:|:---:| |
| 59 | +|  |  | |
| 60 | + |
| 61 | +### A browser leaf, sandboxed |
| 62 | + |
| 63 | +Type into Quick Search and OpenFall opens results in a **locked-down web leaf**, a sandboxed view that lives right beside your notes. (This is *web* search; it never touches the contents of your leaves.) |
| 64 | + |
| 65 | +<p align="center"><img alt="browser leaf" src="docs/screenshots/web.png" width="820"></p> |
| 66 | + |
| 67 | +### Light and dark |
| 68 | + |
| 69 | +Dark by default; flip to Light or Match System at any time. |
| 70 | + |
| 71 | +<p align="center"><img alt="light theme" src="docs/screenshots/light.png" width="820"></p> |
| 72 | + |
| 73 | +## Download and run (alpha) |
| 74 | + |
| 75 | +Grab a build from the [**Releases**](../../releases) page: |
| 76 | + |
| 77 | +| Client | What you get | |
| 78 | +|--------|--------------| |
| 79 | +| **Windows installer** | `OpenFall Setup *.exe`, a standard NSIS install | |
| 80 | +| **Windows portable** | `OpenFall *.exe`, a single file, just run it, no install | |
| 81 | +| **Linux** | `openfall-*.tar.gz` (AppImage and `.deb` build on a Linux host) | |
| 82 | +| **Portable (any OS)** | `index.html`, one self-contained file, runs offline in any modern browser | |
| 83 | + |
| 84 | +## Build from source |
| 85 | + |
| 86 | +```bash |
| 87 | +npm install |
| 88 | +npm run dev # web app at http://localhost:5173 |
| 89 | +npm run dev:electron # the desktop app (Vite + Electron, hot reload) |
| 90 | + |
| 91 | +npm run package:win # Windows installer + portable .exe -> release/ |
| 92 | +npm run package:linux # Linux tar.gz (+ AppImage/deb on Linux) |
| 93 | +npm run build:portable # single-file portable client -> dist-portable/index.html |
| 94 | + |
| 95 | +npm test # Vitest unit + integration suite |
| 96 | +npm run typecheck |
| 97 | +``` |
| 98 | + |
| 99 | +## How it works |
| 100 | + |
| 101 | +One React and TypeScript renderer (Vite, Zustand for state, CSS custom properties for theming) runs behind a single `PlatformAdapter` seam with two backends: **Electron** (a frameless, transparent window with real-filesystem autosave) and **web** (localStorage plus the File System Access API). The same renderer also bundles to one self-contained `index.html` for the portable client. |
| 102 | + |
| 103 | +``` |
| 104 | +src/ |
| 105 | + components/ React UI (leaves, editor, search, dialogs, ...) |
| 106 | + state/ Zustand stores plus persistence orchestration |
| 107 | + lib/ pure logic: tokenize, leaf-naming, search, export, seed |
| 108 | + platform/ the PlatformAdapter seam (web plus electron) |
| 109 | +electron/ main process plus preload (transparent window, app:// protocol, fs autosave) |
| 110 | +``` |
| 111 | + |
| 112 | +## Credits |
| 113 | + |
| 114 | +Created by **[DatJavaClass](https://github.com/DatJavaClass)**, with **Claude** (Anthropic) assisting on implementation. Mascot: *Codeman*. |
| 115 | + |
| 116 | +## License |
| 117 | + |
| 118 | +[MIT](LICENSE). |
0 commit comments