- Overview
- Features
- Screenshots
- Technology Stack
- Prerequisites
- Quick Start
- Scripts and Commands (All OS)
- Project Structure
- Configuration
- Documentation
- Troubleshooting
- Contributing
- License
Forevernote is a Java 17 + JavaFX 21 desktop application inspired by Obsidian-like workflows:
- Fast note writing/editing with Markdown preview
- Folder hierarchy + tags + favorites + recent + trash
- Command palette and quick switcher
- External plugins (
plugins/) and external themes (themes/) - Storage mode: SQLite or FileSystem vault
- Create, edit, save, delete, and restore notes
- Hierarchical folders and subfolders
- Tags with assignment/removal workflows
- Favorites and recent notes
- Trash with restore for notes and nested folders
- Global search and sorting
- Markdown rendering with GFM tables, autolinks, strikethrough
- Live preview and split mode
- Syntax highlighting for fenced code blocks (highlight.js)
- Obsidian-style wikilinks parsing/indexing (
[[note]],[[note|alias]],![[asset]]) for navigation and graph
- Light, dark, system themes + external themes
- Retro phosphor sample external theme
- Configurable sidebar/editor button presentation (text/icons/auto)
- List and grid note views
- Compact and responsive layout behavior
- Multi-note tabs in editor
- Integrated graph workspace (global/local) with zoom/pan and reindex support
- External plugin loading from JAR files in
plugins/ - Plugin manager UI
- Plugin lifecycle support (load/enable/disable/shutdown)
- Theme catalog with external theme discovery and safe fallback
- Java 17
- JavaFX 21
- Maven 3.9+
- SQLite JDBC
- CommonMark
- Ikonli (Feather icons)
- JUnit 5 + H2 (tests)
- Java JDK 17
- Maven 3.9+
Check installation:
java -version
mvn -versiongit clone https://github.com/RGiskard7/Forevernote.git
cd Forevernote./scripts/build_all.sh.\scripts\build_all.ps1./scripts/launch-forevernote.sh.\scripts\launch-forevernote.bat
# or
.\scripts\launch-forevernote.ps1All commands assume repository root:
/Users/edu/visual-studio-code-workspace/Forevernote
| Purpose | Linux/macOS | Windows PowerShell | Windows CMD |
|---|---|---|---|
| Build app | ./scripts/build_all.sh |
.\scripts\build_all.ps1 |
N/A |
| Run app (dev runner) | ./scripts/run_all.sh |
.\scripts\run_all.ps1 |
N/A |
| Run app (launcher, recommended) | ./scripts/launch-forevernote.sh |
.\scripts\launch-forevernote.ps1 |
.\scripts\launch-forevernote.bat |
mvn -f Forevernote/pom.xml test
mvn -f Forevernote/pom.xml clean test./scripts/smoke-phase-gate.sh
./scripts/hardening-storage-matrix.sh.\scripts\smoke-phase-gate.ps1
.\scripts\hardening-storage-matrix.ps1./scripts/build-plugins.sh
./scripts/build-plugins.sh --clean.\scripts\build-plugins.ps1
.\scripts\build-plugins.ps1 -Clean./scripts/build-themes.sh
./scripts/build-themes.sh --clean
./scripts/build-themes.sh --appdata.\scripts\build-themes.ps1
.\scripts\build-themes.ps1 -Clean
.\scripts\build-themes.ps1 -AppDatamvn -f Forevernote/pom.xml clean package -DskipTests
./scripts/package-linux.sh
./scripts/package-macos.sh.\scripts\package-windows.ps1Packaging scripts now prepare both external plugins and external themes automatically before calling jpackage:
package-macos.sh-> runsbuild-plugins.sh+build-themes.shpackage-linux.sh-> runsbuild-plugins.sh+build-themes.shpackage-windows.ps1-> runsbuild-plugins.ps1+build-themes.ps1
mvn -f Forevernote/pom.xml clean compile exec:java -Dexec.mainClass="com.example.forevernote.Launcher"Forevernote/
├── Forevernote/
│ ├── pom.xml
│ ├── src/main/java/com/example/forevernote/
│ │ ├── config/
│ │ ├── data/
│ │ ├── event/
│ │ ├── exceptions/
│ │ ├── plugin/
│ │ ├── service/
│ │ ├── sync/
│ │ ├── ui/
│ │ └── util/
│ ├── src/main/resources/com/example/forevernote/
│ │ ├── i18n/
│ │ ├── plugin/
│ │ ├── ui/css/
│ │ ├── ui/preview/
│ │ └── ui/view/
│ ├── src/test/
│ └── themes/ # runtime-installed external themes
├── plugins/ # external plugin jars
├── plugins-source/ # sample plugin source workspace
├── themes/ # source external themes
├── scripts/
├── doc/
├── AGENTS.md
├── changelog.md
├── README.md
└── README.es.md
- SQLite database (default) or FileSystem vault mode
- Runtime folders are created automatically as needed:
Forevernote/data/Forevernote/logs/
External theme format:
themes/<theme-id>/theme.properties
themes/<theme-id>/theme.css
- Place plugin JAR files in
plugins/ - Open plugin manager from Tools menu for enable/disable operations
Short answer: usually no.
-
Development run (
run_all.*/launch-forevernote.*):build-plugins.*places JARs intoForevernote/plugins/build-themes.*places themes intoForevernote/themes/- App resolves both locations directly, no manual move required.
-
Packaged installers (
package-*):- Scripts already build plugins/themes automatically.
- If your JDK supports
jpackage --app-content, plugins/themes are bundled. - If not (common with JDK 17), app still works but users should place files in AppData:
- Windows:
%APPDATA%\Forevernote\pluginsand%APPDATA%\Forevernote\themes - macOS:
~/Library/Application Support/Forevernote/pluginsand~/Library/Application Support/Forevernote/themes - Linux:
~/.config/Forevernote/pluginsand~/.config/Forevernote/themes
- Windows:
- doc/BUILD.md
- doc/ARCHITECTURE.md
- doc/PLUGINS.md
- doc/LAUNCH_APP.md
- doc/PACKAGING.md
- doc/EVENT_BUS_CONTRACT.md
- doc/DEFINITION_OF_DONE.md
- doc/PROJECT_STATUS.md
- doc/PROJECT_ANALYSIS.md
- AGENTS.md
If you get JavaFX runtime/module-path issues, use launcher scripts (launch-forevernote.*) instead of running JAR directly.
Ensure both are available in PATH:
java -version
mvn -versionWarnings such as Failed to build parent project for org.openjfx:javafx-* are known and non-blocking.
- Emoji rendering depends on the platform font stack and JavaFX WebView behavior. Some emoji glyphs may not render consistently across OSes.
- For local embeds (
![[file.ext]]), ensure files exist in the selected vault/path and use supported image formats (e.g.png,jpg,jpeg,gif,svg,webpwhere available on your platform/runtime).
- Keep changes focused and incremental.
- Run tests before opening PR.
- Preserve SQLite/FileSystem and plugin compatibility.
- Update documentation when behavior changes.
MIT. See LICENSE.




